一.表的加法:
注意事项:
1.将两个表按照行合并在一起,列名需要相同
2.加法时,会将重复数据自动删除
3.若想保留全部行,union all 即可
二. 表的联结 join
联结:将2张表通过某一列关联起来,将2张表合并进行操作
1. 交叉联结 cross join 也叫笛卡尔积
是将表1中每一行都与表2中每一行合并在一起,交叉联结后,新表行数是两张表行数的乘积,例如扑克牌就是交叉联结产生结果
交叉联结是基础,其他联结相当于是在交叉联结上添加了过滤条件
2. 内联结 inner join
查找出同时存在于两张表的数据
3. 左联结 left join
(1)将两个表相同数据取出来同时,将左侧表中的数据全部取出来,进行合并即交叉联结,没有相同部分的数据,对应的数据为空值
(2)如果想要去掉两张表中交叉部分,只取左表剩余部分,如下图:
4.右联结 right join
(1)将两个表相同数据取出来同时,将右侧表中的数据全部取出来,进行合并即交叉联结
5.全联结 full join
会返回左表和右表中的所有行,当有匹配行进行合并,没有就对应空值,目前Mysql 不支持全联结
6.总结:
什么情况用哪一种联结:
想要生成固定行数的表单,或者特别说明了要哪一张表里的全部数据的时候,使用左联结或者右联结,大部分情况都是用内联结找到表的公共部分
三. 应用案例
练习1:查询所有学生的学号,姓名,选课数,总成绩
练习2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
练习3:查询学生的选课情况:学号,姓名,课程号,课程名称
四. Case表达式
使用case表达式可以帮助解决复杂的查询问题,作用相当于进行条件判断的函数,用来判断每一行是否满足某个条件
Case后面的where 是判断了解,如果符合就执行对应的then字句,结束运行
如果不满足条件,在后面子句中继续判断,都不符合执行else对应的语句
当有多种情况要条件判断是,可以用case表达式,它可以写在SQL语句中的任一子句中,注意end是一定要写的
练习1:查询出每门课程的及格人数和不及格人数
练习2:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
参考文献:
知乎live讲座,从零学SQL