0
点赞
收藏
分享

微信扫一扫

MySQL之约束、表的设计、新增、聚合查询、多表查询(表增删改查进阶)

兽怪海北 2022-03-14 阅读 51

🪶引言
前面给大家介绍了MySQL中表的增删改查的基本操作,今天给大家详细介绍MySQL的约束,以及聚合查询、联合查询的操作。如果哪里总结的不对的地方欢迎大家与博主讨论,共同学习,如果喜欢的,请大家多多支持,三连支持一下博主,谢谢大家🎉。
MySQL表的增删查改基本操作:

请添加图片描述

文章目录

🍁约束

🍁1.NULL NULL

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

🍁 2.UNIQUE

在这里插入图片描述

在这里插入图片描述

🍁3.DEFAULT

在这里插入图片描述
MySQL中,默认的默认值,是 NULL
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

🍁4.PRIMARY KEY

在这里插入图片描述
对于一个表来说,只能有一个列被指定为主键!

插入空值时:

在这里插入图片描述

重复插入时:
在这里插入图片描述

🍁自增主键

在这里插入图片描述

在这里插入图片描述
每次新增一个新的记录,都会产生一个自增的id
在这里插入图片描述

例如: 这里我们指定插入 id=10 name = 李四;
在这里插入图片描述
当我们在次使用自增主键 进行插入时,就从 我们刚刚插入的 id=10,来排了
在这里插入图片描述

🍁5.FOREIGN KEY

在这里插入图片描述
使用自增主键先构建一个 学生表
在这里插入图片描述
接下来构造一个 学生表 来指定一下 外键约束

在这里插入图片描述

外键约束的工作原理:

🍁 表的设计

在这里插入图片描述
在这里插入图片描述

🍁1. 一对一

在这里插入图片描述

🍁 2. 一对多

在这里插入图片描述
在这里插入图片描述
对于MySQL来说 表示 一对多 的时候,只能采用方案二,不能采用方案一,因为MySQL中没有提供 类似于"数组"这样的类型~
但是像 Redis 这样的数据库,就有数组类型,就可以 考虑使用方法一的方式来表示

🍁3. 多对多

在这里插入图片描述

🍁新增

查询表A
在这里插入图片描述
查询表B
在这里插入图片描述
把表A 的记录 插入到 表B 中
在这里插入图片描述
接下来,我们把 B 的列的 顺序 调换一下,此时能否完成 把A的数据给 插入到 B这个操作呢?

在这里插入图片描述
我们发现是可以的,只要保证A的查询结果的列的顺序和B对应即可

🍁聚合查询

🍁聚合函数

在这里插入图片描述
count 这里的参数不一定非要 写作 * 可以指定某个列
在这里插入图片描述
NULL 这样的值不会记录 到 count 中

在这里插入图片描述

在这里插入图片描述
sum 这个操作只能针对数字进行运算,不能针对字符串来进行

在这里插入图片描述
一个聚合函数里面的参数,也可以 通过 表达式的方式 进行 运算
在这里插入图片描述
聚合函数,还可以搭配 where 字句来使用,可以基于条件进行筛选,
在这里插入图片描述

🍁GROUP BY 子句

给出一张表
在这里插入图片描述
查询每个角色的最高工资,最低工资和平均工资,这种操作就是需要按照岗位,来进行分组

group by role 根据 role 这一列进行分组
在这里插入图片描述
再根据 分组再来执行 每个组的聚合
在这里插入图片描述

此处 id = 8 的 chinese 值为NULL 删除 以后 对avg 无影响
在这里插入图片描述

group by 是可以使用 where,只不过 where 是在 分组之前执行的,如果要对分组之后的结果 进行条件筛选,就需要使用 having

这里就是 先去掉 马云,然后再分组(分组之前指定的条件,就要使用where)

在这里插入图片描述

这里就是得先分组计算,知道了平均工资,才能进一步的筛选(分组之后,指定的条件,就需要使用having了)
在这里插入图片描述

🍁联合查询(多表查询)

🍁 笛卡尔积

比如,现在有两张表,学生表和班级表
在这里插入图片描述
针对A B 两张表,计算笛卡尔积
在这里插入图片描述
此时 笛卡尔积列数=A 的列数 + B 的列数.笛卡尔积
行数=A 的行数 * B 的行数

笛卡尔积的运算过程:先拿第一张表的第一条记录,和第二张表的每个记录,分别组合,得到了一组新的记录,继续拿第一张表的第二条记录,重复刚才的操作

最简单的做法,就是直接 select * from 后面跟上多个表名,表名直接用逗号 分割
有两张表 分别为 student 和 calss
在这里插入图片描述
对两表进行 笛卡尔积
在这里插入图片描述
在这些排列组合中,仔细看,有没有一些数据 使我们需要的,另外一些数据是没有意思的呢?

两张表中都有 classId 这一列,classId值对应相等的记录,其实就是应该要保留的记录
在这里插入图片描述
像这里 classId 相等这样的条件,就称为"连接条件"
在这里插入图片描述

在这里插入图片描述

🍁多表查询

现在有 4张表 分别是:
在这里插入图片描述
在这里插入图片描述
在这个场景中,涉及到的实体,主要是三个:
在这里插入图片描述

🍁多表查询具体操作

首先 许仙选了很多课,就需要在学生表中 获取到学生姓名,
在分数表中,获取到分数信息(分析这样的问题,就要先想清楚查询的数据都是来自于那些表里)
1.这里就需要针对 学生表 和 分数表 进行 笛卡尔积
在这里插入图片描述
注意: 仔细观察 就能发现,在当前的这两张表里,都存在学生 id 这个列,按照前面总结的规律,应该指定这两个 id 匹配,才保留记录,不匹配的就是属于是排列组合直接生成的无效数据.
2.找到 指定 id 匹配
在这里插入图片描述
这个里面就体现出了,每个学生的每门课程,分数分别是多少

3.过滤其他同学

在这里插入图片描述

在这里插入图片描述

这个案列 要在 多表查询 的基础上,再加一个聚合查询
在这里插入图片描述
这个效果就显示出每个同学的每个科目的分数,此处可以看到,同学的分数,是按照行的方式来排列的

加上 group by id 之后,我们可以看到,记录的行数明显变少了,每个同学只有一行数据了
在这里插入图片描述
此处要想得到总成绩,就需要 进行 sum 操作
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
当前这个表 列出了每个同学的每个课程拿到的分数,同时带有课程的名字
去掉不必要的列,只保留关注的关键列
在这里插入图片描述

🍁 自连接,外连接,内连接

比如:显示计算机原理成绩 比 java成绩高的成绩信息
科目表:
在这里插入图片描述
分数表:
在这里插入图片描述
在这个问题中,可以看到,这里的条件是按照行的方式来排列的,为了解决这个问题,就需要把行,给转换成列,把行转换成列就可以用到自连接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自连接关键所在就是把 行转换成列

🍁子查询

先知道 不想毕业这个同学的班级id

在这里插入图片描述
然后根据班级id 在学生表中 筛选 同 id 的同学
在这里插入图片描述
最后
在这里插入图片描述

🍁合并查询

在这里插入图片描述
这个写法也可以使用 or 来替换
在这里插入图片描述
使用 or 的时候 ,必须保证你是针对的同一个表来指定的多个条件查询,而第一种写法 不一定 针对 同一张表

举报

相关推荐

0 条评论