🪶引言
前面给大家介绍了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 的时候 ,必须保证你是针对的同一个表来指定的多个条件查询,而第一种写法 不一定 针对 同一张表