一.表的加法
通过union实现,会自动删除重复行,要想保留重复行用union all,实际操作如下:
二.表的联结
1.交叉联结
是行的乘积;例子:扑克牌;交叉联结是一切联结的基础,其他联结都是加了其他的筛选条件
2.内联结
作用:查找出同时存在在两张表中的数据。举例过程如下
3.左联结
作用:将左侧表中的数据全部取出
注意:没有对应的行用null填充
想要不取出重复部分,加上where语句:
3.右联结(相反于左联结)
4.全联结
三.联结应用案例
案例一:
实操结果如下:
案例二:
实操如下:
案例三:
实操如下:
四.case表达式
作用:条件判断的函数,判断每一行是不是满足某一条件
注意事项:else可以省略;end不能省略;可以写在任意子句里
例子1:查找成绩及格或不及格
实操如下:
例子2.查询每门课的及格人数和不及格人数
把count子句换成case when:
实操如下:
例子3.
实操如下:
五.sqlzoo练习题
1)解释下where子句中的条件:
主队是德国或者客队是德国,比如
德国 和 A对比赛(德国是主队),进球的是A队
A队和德国比赛(德国是客队),进球的是A队
所以条件是(b.teamid = a.team1 and a.team2 = 'GER') or (b.teamid = a.team2 and a.team1 = 'GER')
2)内联结的结果中入门球员有重复值,用distinct去掉重复值
问题分析:
球队名称(球队信息表eteam),和每个球队进球人数(进球信息表goal:按球队名称分组统计count(teamname)
问题分析:
比赛地点(比赛信息表game),和每个比赛地点的进球数(进球信息表goal:按比赛地点分组,对进球人员进行汇总count(player))联结方式是什么?要查出比赛信息表game中全部比赛地点,所以是左联结
查找出所有比赛的日期,每场比赛中对战双方各自的进球数(也就是team1进球数,team2进球数)问题分析:
当比赛信息表game中的球队编号(team1)也出现在进球信息表(goal)中时,表示这个球队进球了,使用case语句来统计