一、表的加法(union)
功能:将两个表的数据合并在一起,会把两个表里重复的数据删除,如果想保留重复的数据改成union all
随堂练习
不重复:

保留重复数据:

二、表的联结(join)
表之间的关系:

常见表的联结方式:交叉联结、内联结,左联结,右联结,全联结
(1)交叉联结(笛卡尔积,cross join)
功能:将表中的每一行都与另一个表中的每一行合并在一起
交叉连结实际运用中较少
(2)内联结(inner join)
功能:查找出同时存在于两张表中的数据
运行顺序:先将表中相同列名对应的行取出来——将两个表里取出的数据交叉联结,合并以后的表有了两行表里的全部信息。
随堂练习:

(3)左联结(left join)
功能:将左侧表中有的信息全部取出
运行顺序:先将左表中的数据读取出来——将另一张表中有左表数据相应的行取出——将两个表里的数据进行交叉联结,如果表里没有数据将产生空值
随堂练习:

去掉公共部分随堂练习:

(4)右联结(right join)
功能:将左侧表中有的信息全部取出
运行顺序:先将右表中的数据读取出来——将另一张表中有右表数据相应的行取出——将两个表里的数据进行交叉联结,如果表里没有数据将产生空值
随堂练习:

随堂练习:去掉交叉部分

(5)全联结(full join)
功能:取两张表中的所有行,合并没有内容时显示空值。注意mysql不支持全联结。
(重要)使用场景:当实际中想要生成固定行数的表单或者特别说明要哪一张表里的全部数据,使用左/右联结,其他情况使用内联结。
sql运行顺序:子查询——from,where,group by,having——select——order by,limit
三、联结应用案例
随堂练习1:查询所有学生的学号、姓名、选课数、总成绩

随堂练习2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩

随堂练习3:查询学生选课情况(查询学号,姓名,课程号,课程名称)

注意:as 可以省略
四、case表达式
功能:进行条件判断的函数
case表达式:
case when <判断表达式> then <表达式>
else<表达式>
end
随堂练习1:

随堂练习2:

本题注意:sum后面与括号之间不能有空格。
case表达式注意点:不要省略else,end一定要写,case可以写在任意sql子句里面。
case表达式使用情景:当有多个条件需要判断的时候。
随堂练习3:

本题重点:
select里的列名只能是group by子句里的列名。
本题课程号与课程名称是一对一的关系,所以对结果不产生影响,如果不是一一对应关系,当多列分组时,这几列的值全部相同才算一组。
五、课后练习题



本题根据题目意思是否队伍名为eteam表中的teamname?


注意:本题要真正理解left join、right join 与 inner join的区别。



本题注意去掉重复的运动员名字,理清主队和客队的关系。



本章学习心得:本次的学习内容听的时候容易理解,但是在实际操作中发现使用起来比较困难,一是有很多细节要注意,二是逻辑上要理的通。sqlzoo练习题中后面稍难的部分仍需多做几次慢慢理解其中的运行层次。最近两章学的较为吃力,这段时间要反复多听几次课程。