
本篇介绍SQL的多表查询,具体分享内容如下:
- 表的加法
- 表的联结
- 联结应用案例
- case表达式
1. 表的加法

1.1 union——不包含重复值

1.2 union all——包含重复值

2.表的联结


表的联结有以下5种:
- 交叉联结(cross join)
- 内联结(inner join)
- 左联结(left join)
- 右联结(right join)
- 全联结(full join)——此联结种mysql不适用
2.1 交叉联结(cross join)
交叉联结也称笛卡尔积,就是将表中的每一行都和另一个表中的每一行合并在一起。

2.2 内联结(inner join)
内联结即查找出同时存在于两表中的数据。


select <表别名1>.<列名1>,<表别名1>.<列名2>,<表别名2>.<列名3>
from <表1> as <表别名1> inner join <表2> as <表别名2>
on <表别名1>.<列名1> = <表别名2>.<列名1>;
2.3 左联结(left join)
左联结将左侧表的数据全都取出来联结右侧表的值,没有匹配的话生成null,左联结见下方方文图


其中:以下表示使用左联结仅留下左表不包含右表部分
select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号 = b.学号
where b.学号 = Null;

2.4 右联结(right join)
右联结会将右侧表中的数据全都取出来联结左侧表的值,没有匹配的话生成null,右联结见下方方文图


其中:以下表示使用右联结仅留下左表不包含左表部分
select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号 = b.学号
where a.学号 = Null;

2.5 全联结(full join)——此联结种mysql不适用

3. 联结应用案例
案例一:查询所以学生的学号、姓名、选课数、总成绩
翻译成大白话如下
- 学号、姓名(student表)
- 选课数(每个学生的选课数目:score表,按学号分组,对课程号计数count)
- 总成绩(每个学生的总成绩:score表,按学号分组,对成绩求和sum)
查询语句如下
select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩
from student as a left join score as b
on a.学号 = b.学号
group by a.学号;
案例二:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
翻译成大白话如下
- 查询出所有学生的学号(student表)、姓名(student表)、平均成绩(每个学生的平均成绩:score表,按学号分组,平均成绩用avg(成绩))
- 平均成绩>85
查询语句如下
select a.学号,a.姓名,avg(b.成绩) as 平均成绩
from student as a left join score as b
on a.学号 = b.学号
group by a.学号
having avg(b.成绩)>85;
案例三:查询学生的选课情况
select a.学号,a.姓名,c.课程号,c.课程名称
from student as a inner join score as b
on a.学号 = b.学号
inner join course as c
on b.课程号=c.课程号;

4. case表达式
case表达式相当于条件判断函数,判断某一行是否满足判断条件,都不符合则运行else语句的内容。

案例一:判断成绩是否及格,60分及以上为及格,60分以下为不及格

案例二:查询出每门课程的及格人数和不及格人数

案例三:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各科成绩,分别统计分数段人数,课程号和课程名称
