MySQL:表的设计原则和聚合函数

news2024/9/20 18:42:22

 所属专栏:MySQL学习

在这里插入图片描述

 

💎1. 表的设计原则

1. 从需求中找到类,类对应到数据库中的实体,实体在数据库中表现为一张一张的表,类中的属性对应着表中的字段

2. 确定类与类的对应关系

3. 使用SQL去创建具体的表

范式:范式描述的是数据关系的模型(一对一关系,一对多关系,多对多关系)

分类:第一范式(1NF),第二范式(2NF),第三范式(3NF),BC范式(BCNF)

💎2. 三大范式


💎2.1 第一范式

规定:表中的数据不能再分,在定义表的时候,对照数据中的数据类型,每一个字段都可以用一个数据类型标识,那么当前这个表就满足第一范式

例如:定义一个学生表,其中的字段有:学号,姓名,年龄,班级名,学校名,学校地址,这就符合了第一范式,但是如果是:学号,姓名,年龄,班级名,学校,这就不符合第一范式,因为无法找到一个数据类型来表示学校这个对象

关系型数据库的一个最基本的要求,不满足第一范式就不能称为关系型数据库

💎2.2 第二范式

在满足第一范式的基础上,不存在非关键字段(非主键字段)对任意候选键(主键,外键,没有主键时的唯一键)的部分函数依赖(存在与复合主键的情况下),就满足第二范式,复合主键在上一篇文章中已经介绍过,一个表中不能有两个主键,但是一个主键中可以包含多个列,这时的主键就是复合主键

也就是说,如果这个表不含复合主键,那么这个表就满足第二范式

 先来看一个表中存在复合主键的情况下,存在非关键字段对候选键的部分函数依赖的不符合第二范式的反例:

学生选修课成绩表
学号姓名年龄课程名称学分成绩
202201张三19MySQL3100

其中,年龄和姓名依赖学号(对应唯一学号),学分依赖课程名称,成绩通过学生和课程共同区分,也就是这个表中可以用学生和课程作为复合主键来确定学生当前的课程成绩,对与其他的,学分和学号,学生姓名等没有关系,学生的姓名和课程名等也没有关系

像这样的,对于由两个或多个关键字段共同决定一条记录(存在复合主键)的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么就称为只存在部分函数依赖,对于这样的情况就不满足第二范式

接下来看一个正面例子:

 对于这样的设计,每张表都有非主键字段,都强依赖与主键,第三个表存在的复合主键,非主键依赖于两个主键的字段,不存在部分函数依赖,满足第二范式

 不符合第二范式的时候的弊端:

学生选修课成绩表
学号姓名年龄课程名称学分成绩
202201张三19MySQL3100
202202李四19MySQL3100
202203王五20Java2

95

202204赵六19Java296

1. 数据冗余

学生的年龄和学分大量出现,造成数据冗余

2. 更新异常

如果需要修改MySQL的学分,那么就需要修改表中所有关于MySQL的记录,如果说只有部分数据修改成功,剩余的还是原来的数据,就会出现数据不一致,造成数据混乱

3. 插入异常

当前表格在有学生录入成绩后才能查看课程的学分信息,例如:如果说这时学校加入一门新课,但学生都没有考过试,那么这门新课在数据库就就没有记录

4. 删除异常

同插入异常一样,如果需要删除学生成绩,例如,把选Java的两位同学成绩删除,那么此时在数据库中就又没有Java这门课程的学分信息了

💎2.3 第三范式

在第二范式的基础上,不存在非关键字段对任意候选键的传递依赖

学生表
学号姓名年龄所在学院学院地址

在这个表中,描述的主要对象是学生,所以学号可以作为主键,此时,姓名和年龄与学号是强相关的,学院地址与所在学院是强相关的,描述学生所在学院,只需要把学生和学院建立一个关联关系即可,这两个强相关关系存在传递现象 学号->所在学院->学院地址 ,这种传递关系就称为传递依赖,所以说这种设计不满足第三范式

根据学生与学院的关系,拆分为两张表就满足了第三范式:

学院表
学院编号学院名称学院地址
学生表
学号姓名年龄学院编号

这样设计,两张表都依赖与自己表中的主键,学生表可以通过外键与学院之间建立关联关系 

💎3. 三种关系 

 💎3.1 一对一关系

例如设计一个登录界面,输入用户名和密码登录成功之后,显示欢迎用户,这样的场景一般对应两个实体,用户和账号,并且一个用户只对应一个账号,就是一对一的关系

针对一对一关系设计表时有两种方式

第一种就是把两个实体所有的信息放在一张表中

use_idnamephone_numberusernamepassword

第二种就是设计两张表,分别记录用户信息和账号信息,再把两张表关联起来

1.第一种关联方式就是通过用户id进行关联,场景:当输入用户名和密码并校验成功之后,再通过用户id去查找用户的name

user_idnamephone_number
account_idusernamepassworduser_id

 2.第二种关联方式通过account_id进行关联

account_idusernamepassword
user_idnamephone_numberaccount_id

💎3.2 一对多关系 

一对多关系其实很常见,例如学生和班级的关系:一个班级中可以有多个学生

创建学生和班级表:

班级表
class_idname
学生表
student_idnameclass_id

💎 3.3 多对多关系 

例如学生进行选课,一个学生可以选多门课,一门课可以被多名学生选择

分别创建实体表:

课程表
course_idname
1

MySQL

2Java
学生表
student_idnameage
202201张三19
202202李四20

 创建关系表

学生选修课程表
idstudent_idcourse_id
12022011
22022021
32022022

通过关系表,就可以记录每位同学选择的课程,并且符合第二范式,修改学生的年龄字段时也不会影响到关系表

最后把之前讲到的综合起来创建一张成绩表

-- 班级表
create table class
(
    class_id bigint primary key auto_increment,
    name     varchar(20) not null
);

-- 学生表
create table student
(
    student_id bigint primary key auto_increment,
    name       varchar(20) not null,
    age        bigint,
    class_id   bigint,
    -- 设置class_id为class表class_id的外键
    foreign key (class_id) references class (class_id)
);

-- 课程表
create table course
(
    course_id bigint primary key auto_increment,
    name      varchar(50) not null
);
-- 成绩表
create table score
(
    score_id   bigint primary key auto_increment,
    student_id bigint,
    course_id  bigint,
    score      decimal(5, 2),
    -- 设置student_id为student表student_id的外键
    foreign key (student_id) references student (student_id),
    -- 设置course_id为course表course_id的外键
    foreign key (course_id) references course (course_id)
);

💎4. 新增

需求:创建一个新表,把原来的表的数据内容复制到新表中

我们有以下几种解决方法:

1. 一条一条的插入,很明显,这种方法很麻烦,如果数据量很大就不好操作

2. 把原来的数据导出来,再把表名修改一下,再改入到目录表中

3. 使用 insert into select 语句

第二个方法就是在 navicat 中直接进行表的复制

下面来看使用 insert into select 语句的方法

-- 新建一张表,把旧表导入到新表中
create table new_student
(
    id   bigint primary key auto_increment,
    name varchar(50)
);
-- 把在原来的表中查到的数据插入到新的表中
insert into new_student
select id, name
from student;

需要注意的就是,查询到的列和要插入的列要匹配,不然就会报错

💎5. 聚合函数

函数说明
COUNT([DISTINCT] expr)  返回查询到的数据的数量
SUM([DISTINCT] expr)返回查询到的数据的总和
AVG([DISTINCT] expr)返回查询到的数据的平均值
MAX([DISTINCT] expr)返回查询到的数据的最大值
MIN([DISTINCT] expr)返回查询到的数据的最小值

💎5.1 COUNT() 统计所有行

-- 统计表中的行数
select count(*)
from student;
-- 也可以传入常量 1
select count(1)
from student;

星号(*)并不直接表示表中的任意一列,而是作为一个特殊的指示符,告诉数据库管理系统(DBMS)计算表中的行数,而不关心表中的列内容或是否有NULL值。

还可以指定某一列进行统计:

-- 指定列统计
select count(id)
from student;

select count(name)
from student;

💎5.2 SUM() 求和 

创建一张成绩表,计算语文的总成绩

create table exam
(
    id      bigint primary key auto_increment,
    name    varchar(20),
    chinese decimal(5, 2),
    math    decimal(5, 2)
);
insert into exam(id, name, chinese, math)
values (1, '张三', 98, 95),
       (2, '李四', 97, 99),
       (3, '王五', 96, 98),
       (4, '赵六', 97, 94);
-- 计算语文总成绩
select *
from exam;
select sum(chinese)
from exam;

 

 查询到的结果存储在了临时表中,不受字段中长度的约束(decimal(5, 2)

如果说求和的那一列存在null的话,会是像之前表达式相加时,null加上任何值都是null的情况吗?

insert into exam values (5,'钱七',96,null);

select sum(math)
from exam;

可以看出,最终的值并没有加上null ,并且,如果是非数值类型求和是没有意义的

💎5.3 AVG() 求平均值

-- 求平均值
select avg(math)
from exam;

-- 参数里边可以包含表达式,结果可以使用别名
select avg(math + chinese) as 总分平均值
from exam;

💎5.4 MAX()和MIN()

求指定列中的最大值和最小值

-- 求最大值和最小值
select max(chinese) as 语文最大值,
       min(math) as 数学最小值
from exam;

 可以多个聚合函数使用,同时也可以使用别名

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux多线程】线程同步 与 生产者消费者模型(无锁化模型)

文章目录 1. Linux线程同步1.1 条件变量1.2 同步概念与竞态条件1.3 条件变量函数示例代码1:示例代码2 1.4 为什么 pthread_ cond_ wait 需要互斥量1.5 条件变量使用规范 2. 生产者消费者模型3. 读者 写者 问题3.1 读写锁3.2 读写锁的相关接口 4. 扩展:无锁化模型4.1…

Python 如何创建和解析 XML 文件

XML(可扩展标记语言)是一种广泛使用的标记语言,主要用于存储和传输数据。它具有结构化、层次化的特点,常被用作数据交换格式。Python 提供了多种工具和库来处理 XML 文件,包括创建、解析和操作 XML 文档。 一、XML 简…

免费webp转jpeg或gif工具

1、”“添加webp文件;”-“移除webp文件;”>>“开始转换;”X“清空内容。 也可以把想要转换的文件全选,拖进窗口里。 2、默认将webp文件转换成同名的png文件放在原来的文件夹里。如果不是静态图片,则自动尝试转…

案例:ZooKeeper + Kafka消息队列集群部署

目录 消息队列 概念 使用场景 不适宜 适宜 消息队列的特征 存储 异步 异步的优点 同步 为什么需要消息队列 解耦 作用 冗余 扩展性 灵活性 峰值处理能力 可恢复性 顺序保证 Kafka 概念 Kafka技术名词 (1)Broker (2&a…

基于Orangepi全志H616智能视觉垃圾分类系统

目录 一、功能需求 二、Python的安装和环境搭建 三、Python基础 3.1 Python的特点: 3.2 Python的基础学习: 3.3 字典的多层嵌套: 四、C语言调用Python 4.1 搭建编译环境: 4.2 C语言执行Python语句: 4.3 C语言…

22 注意力机制—Transformer

目录 TransformerTransformer 架构对比 seq2seq多头注意力(Multi-head attention)带掩码的多头注意力(Masked Multi-head attention)基于位置的前馈网络(Positionwise FFN)残差连接和归一化(Add & norm)(加 & 规范化)1、加入归一化能够更好地训练比较深的网络…

UE基础 —— 项目与模板

虚幻引擎 项目 包含游戏和应用程序的所有内容,并将所有内容联系在一起;包含磁盘上的许多文件夹和资产,如蓝图、材质、3D资产、动画等;内容浏览器与磁盘上的文件夹和文件夹结构相同; 每个项目都有与之关联的.uproject文…

性能优化理论篇 | 彻底弄懂系统平均负载

Linux 上的进程状态 要讨论系统平均负载,首先要了解Linux 上的进程状态。 标志名称内核名称及解释R运行中或可运行TASK_RUNNING。进程正在执行或等待执行。可以在用户空间(用户代码)或内核空间(内核代码)中运行。S可…

【项目】基于Vue3.2+ElementUI Plus+Vite 通用后台管理系统

构建项目 环境配置 全局安装vue脚手架 npm install -g vue/cli-init打开脚手架图形化界面 vue ui创建项目 在图形化界面创建项目根据要求填写项目相关信息选择手动配置勾选配置项目选择配置项目然后我们就搭建完成啦🥳,构建可能需要一点时间&#xff0…

Navicat Premium Lite For Linux,一款免费的专业可视化 SQL 数据库设计工具,支持各种数据库并行连接,在业界可是大名鼎鼎!

Navicat Premium Lite For Linux,一款免费的专业可视化 SQL 数据库设计工具,支持各种数据库并行连接,在业界可是大名鼎鼎! Navicat 是一个可视化数据库、数据表设计软件,支持MySQL、MariaDB、SQLite、MongoDB、Redshi…

论文阅读笔记:ST-MetaNet-1

目录 前言 摘要 CCS 关键词 介绍 时空相关性的复杂组合 空间相关性 时间相关性 时空相关性的多样性 本篇博客结语 前言 读这篇论文边读边学,每天坚持发博客,看到哪学到哪,这系列文章既有翻译,又有深度详细解释&#xff…

Rust学习笔记1--下载安装和使用

一、下载和安装: 官网:https://www.rust-lang.org/ 直接下载即可,windows:按照教程执行步骤。 二、使用: 2.1 在vscode中安装rust 2.2 编译与运行rust文件: 后缀名rs: 编译: …

org.springframework.boot.autoconfigure.AutoConfiguration.imports 配置没有生效

在spring3.x以后,自动配置需要配置在org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中 如果你配置了却没生效,有可能是创建的目录不对,正常情况下, META-INF.spring 是一个两层目录,如果是从别的地方复制…

第51集《大佛顶首楞严经》

请大家打开讲义第 111 页。癸三,结责迷情。 当我们在修学首楞严王三昧的时候,要把握两个很重要的原则:第一个就是它修学的方法,第二个就是它修学的目标。 那么,首楞严王的修学方法是什么呢(这一点蕅益大师…

零基础读懂 DDPM 数学推导

零基础读懂 DDPM 数学推导 完整PDF文件可以在工坊获得,以下是内容截图。

为何显示keyerror fruit,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

【docker综合篇】关于我用docker搭建了6个应用服务的事

最近一直在捣鼓docker,利用测试服务器,本着犯错就重来(重装系统)的大无畏精神,不断尝试,总结经验,然后在网上搜寻一些关于docker有关的服务镜像,并搭建起来。看着一个个服务在我的服务器跑起来,…

【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端

【QT】基于UDP/TCP/串口的Ymodom通讯协议客户端 前言Ymodom实现QT实现开源库的二次开发-1开源库的二次开发-2 串口方式实现TCP方式实现UDP方式实现补充:文件读取补充:QT 封装成EXE 前言 Qt 运行环境 Desktop_Qt_5_11_2_MSVC2015_64bit ,基于…

PowerShell自动化Windows系统管理任务

​ 大家好,我是程序员小羊! 前言 Windows系统管理涉及许多繁琐的任务,如用户管理、文件操作、系统更新、网络配置等。PowerShell作为Windows的命令行工具和脚本语言,可以极大地简化这些管理任务。本文将探讨如何使用PowerShell自动…

【教学类-75-01】20240817“通义万相图片最大化+透明png”的修图流程

背景需求: 打印了袜子配对的PDF模版,做预测试 【教学类-74-02】彩色袜子配对02--左右配对-CSDN博客文章浏览阅读497次,点赞10次,收藏9次。【教学类-74-02】彩色袜子配对02--左右配对https://blog.csdn.net/reasonsummer/article…