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

 所属专栏: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.rhkb.cn/news/397224.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从“抠图”到“抠视频”,Meta上新AI工具SAM 2。

继2023年4月首次推出SAM,实现对图像的精准分割后,Meta于北京时间2024年7月30日推出了能够分割视频的新模型SAM 2(Segment Anything Model 2)。SAM 2将图像分割和视频分割功能整合到一个模型中。所谓“分割”,是指区别视…

API 签名认证:AK(Access Key 访问密钥)和 SK(Secret Key 私密密钥)

API签名认证 在当今的互联网时代,API作为服务与服务、应用程序与应用程序之间通信的重要手段,其安全性不容忽视。你是否遇到过需要在HTTP请求中加入访问密钥(ak)和私密密钥(sk)的情况?是不是担心这些敏感信息会被拦截或者泄露?本…

【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁

文章目录 乐观锁和悲观锁重量级锁和轻量级锁挂起等待锁和自旋锁公平锁和非公平锁可重入锁和不可重入锁读写锁相关面试题 锁:非常广义的概念,不是指某个具体的锁,所有的锁都可以往这些策略中套 synchronized:只是市面上五花八门的锁…

[独家原创]基于分位数回归的Bayes-GRU多变量时序预测【区间预测】 (多输入单输出)Matlab代码

[独家原创]基于分位数回归的Bayes-GRU多变量时序预测【区间预测】 (多输入单输出)Matlab代码 目录 [独家原创]基于分位数回归的Bayes-GRU多变量时序预测【区间预测】 (多输入单输出)Matlab代码效果一览基本介绍程序设计参考资料 效…

RM麦轮控制以及底盘解算

一个典型的RM机器人四轮底盘由电机,底板,悬挂等构成,底盘安装在底盘的四角,呈矩形分布,麦克纳姆轮的辊子方向会影响其运动性能,一般采用如下图所示,四个麦轮的辊子延长线都过底盘中心的安装方法…

c语言学习,atoi()函数分析

1:atoi() 函数说明: 检查参数*ptr,子串中数字或正负号,遇到非数字或结束符停止 2:函数原型: int atoi(const char *ptr) 3:函数参数: 参数c,为检测子串 4:…

MyBatis 配置与测试方式

目录 一,什么是MyBatis 二,准备工作 创建项目 配置数据库连接 持久层代码 单元测试 一,什么是MyBatis 简单来说,MyBatis 是一款优秀的持久层框架,用于简化JDBC的开发,能更简单完成程序与数据库之间…

从0到1,AI我来了- (5)大模型-本地知识库-I

一、下载&安装Ollama Ollama下载地址: Download Ollama on macOS Github地址:GitHub - ollama/ollama: Get up and running with Llama 3.1, Mistral, Gemma 2, and other large language models. Ollama 是啥? 是一个人工智能和机器学习…

一文搞懂后端面试之不停机数据迁移【中间件 | 数据库 | MySQL | 数据一致性】

数据迁移方面的工作: 重构老系统:使用新的表结构来存储数据单库拆分分库分表、分库分表扩容大表修改表结构定义 数据备份工具 MySQL上常用的两款数据备份工具:mysqldump和XtraBackup mysqldump:一个用于备份和恢复数据库的命令…

Redis中的set类型

set的含义 集合设置(和get相对应) 集合就是把一些有关联的数据放到一起 集合中的元素是无序的(和list的有序是对应的-顺序很重要,这里的无序就是顺序不重要);在list中[]1,2,3],[1,3,2],是两个…

Java开发工具IDEA

IDEA概述 Intellij IDEA IDEA全称Intellij IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具。 集成环境 把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。 IDEA下载和安…

PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读

目录 PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读 一、前言 二、vue-pdf-embed是什么 1、作用与场景 2、vue-pdf-embed的优点 三、项目初始化与依赖安装 1、初始化Vue项目 2、安装依赖 3、集成vue-pdf-embed插件 四、一个实际的应用demo …

Java面试题精选:消息队列(一)

1、为什么使用消息队列 问题用意: 其实就是想问一下消息队列有哪些使用场景,你项目中什么业务场景用到了消息队列,有什么技术挑战。使用MQ后给你带来了什么好处 规范回答: 消息队列的常见使用场景很多,但比较核心的…

【漏洞修复】Tomcat中间件漏洞

1.CVE-2017-12615 抓包上传一句话木马 密码passwd 2.后台弱口令部署war包 先用弱口令登录网站后台 制作war包 将172.jsp压缩成.zip文件,修改后缀为.war 上传 蚁剑链接 3.CVE-2020-1938 Python2 CVE-2020-1938.py IP -p 端口 -f 要读取的文件 漏洞修复&#xf…

超越自我——带你学haproxy算法一遍过!!!

文章目录 前言介绍 静态算法static-rrfirst 动态算法roundrobinleastconn 其他算法source算法map-base 取模法一致性hashuriurI_param 取模法hdr 总结本文相关连接如下: 前言 本文相关连接如下: 如果想更多了解haproxy的相关知识,请点击&am…

HTTP协议和运行原理

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。不仅仅适用于[服务器<–>客户端]也是适用于[服务器<–>服务器] HTTP 状态码 1xx 1xx 类状态码属于提示信息&#xff0c;是协议处理中的一种中间状态&#xff0c;实际…

操作系统 IO 相关知识

操作系统 IO 相关知识 阻塞与非阻塞同步与异步IO 和系统调用传统的 IODMAmmap 内存映射sendfilesplice 常用的 IO 模型BIO&#xff1a;同步阻塞 IONIO&#xff1a;同步非阻塞 IOIO 多路复用信号驱动 IOAIO&#xff1a;异步 IO 模型 IO 就是计算机内部与外部进行数据传输的过程&…

加密案例分享:电子设备制造行业

企业核心诉求选择 1.某企业规模庞大&#xff0c;分支众多&#xff0c;数据安全管理方面极为复杂&#xff1b; 2.企业结构复杂&#xff0c;包括研发、销售、财务、总部、分部、办事处、销售等单位连结成为一个庞大的企业组织&#xff0c;数据产生、存储、流转、使用、销毁变化…

NIO线程模型

NIO线程模型主要涉及以下几个方面&#xff1a; 一、基本概念 NIO&#xff08;New Input/Output&#xff09;是Java的一种新的输入输出模型&#xff0c;也被称为非阻塞IO。其核心特点是数据读写操作均是非阻塞的&#xff0c;即在进行读写操作时&#xff0c;若数据未准备好&…

第129天:内网安全-横向移动WmiSmbCrackMapExecProxyChainsImpacket

这里这个环境继续上一篇文章搭建的环境 案例一&#xff1a; 域横向移动-WMI-自带&命令&套件&插件 首先上线win2008 首先提权到system权限 wmic是windows自带的命令&#xff0c;可以通过135端口进行连接利用&#xff0c;只支持明文方式&#xff0c;优点是不用上传别…