多表查询
目录
一、多表联结 2
1、表的加法(union) 2
2、表的联结(join) 3
1)、交叉联结——笛卡尔积 4
2)、内联结(inner join) 5
3)、左联结(left join) 5
4)、右联结(right join) 7
5)、全联结(full join) 10
3、联结应用案例 10
4、case表达式 12
二、SQLzoo练习 15
1.比赛信息表game 15
2.进球信息表goal 16
3.球队信息表eteam 16
一、多表联结
1、表的加法(union)
加法(union):不保留重复的行
如果想要保留表里重复的行,用union all。
Practice1:
2、表的联结(join)
常用的联结:
交叉联结(cross join)
内联结(inner join)
左联结(left join)
右联结(right join)
全联结(full join)
如何使用:当实际业务中想要生成固定行数的表单,或者特别说明要哪张表单的数据时,使用左联结/右联结。其他情况都用内联结获得公共部分。
1)、交叉联结——笛卡尔积
3*2=6行数据
其他联结是在交叉联结的基础上加了过滤条件。
2)、内联结(inner join)
查找出同时存在两表中的数据。
Practice1:
3)、左联结(left join)
将左侧的表作为主表,主表中的数据全部读取出来。
将两个表中取出的数据进行合并。——左边数据不动,右边的过来匹配。
3.1)左边数据(包括公共区域)
Practice:
3.2)左边数据(不包括公共区域)
Practice:
4)、右联结(right join)
将左侧的表作为主表,主表中的数据全部读取出来。
将两个表中取出的数据进行合并。——左边数据不动,右边的过来匹配。
4.1)右边数据(包括公共区域)
4.2)右边数据(不包括公共区域)
5、全联结(full join)
3、联结应用案例
Q1:查询所有学生的学号、姓名、选课数、总成绩
翻译:1)学号、姓名(学生表student)
选课数(每个学生的选课数:成绩表score,按学号分组,对课程号计数count)
总成绩(每个学生的总成绩:成绩表score,按学号分组,对成绩求和sum)
Q2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
翻译:1)学号,姓名(学生表student),平均成绩(score)
按学号分组,平均成绩:avg(成绩)
平均成绩>85——对查询结果进行过滤
Q3:查询学生的选课情况:学号,姓名,课程号,课程名称
翻译:1)学号,姓名(学生表student)
课程号,课程名称(课程表course)
4、case表达式
使用case 表达式可以帮助解决复杂的查询问题。
case表达式的作用相当于进行条件判断的函数,用来判断每一行是不是满足某一条件。
Q1:查询成绩是否及格
Q2:查询出 每门课程 的 及格人数 和 不及格人数
使用注意事项:
1、else子句可以不写,默认为空值;
2、end不能忽略不写;
3、有条件判断时用case 表达式
Q3:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称。
注:只有当用多个列来分组时,这几个列的值全部相同才算一组。
二、SQLzoo练习
题目来自sqlzoo的子查询题目
网址:https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial
这部分题目使用的是‘2012年欧洲足球锦标赛’数据库里的表。
1.比赛信息表game
id比赛编号,mdate比赛日期, stadium比赛地点, team1对战双方(球队编号1), team2对战双方(球队编号2)
2.进球信息表goal
matchid比赛编号,teamid球队编号, player进球球员的姓名,gtime多长时间进的球(从开始比赛到进球多长时间,单位:分钟)
比赛信息表game(id比赛编号)和进球信息表goal(matchid比赛编号)通过‘比赛编号’联结
3.球队信息表eteam
id球队编号(联结2) teamname 球队名称 coach教练
进球信息表goal(teamid球队编号)球队信息表eteam(球队编号id)通过‘球队编号’联结