![18056db608cc072144aa666677285828.png](https://i-blog.csdnimg.cn/blog_migrate/0f97635f6f0bf593467a63a054ec378a.jpeg)
本篇介绍SQL的多表查询,具体分享内容如下:
- 表的加法
- 表的联结
- 联结应用案例
- case表达式
1. 表的加法
![a767aba24fafe3d3a75dabf8998bf220.png](https://i-blog.csdnimg.cn/blog_migrate/88246521bfb88f1752d326b85501de45.jpeg)
1.1 union——不包含重复值
![c46f9a3bdafb269ce522418d51f7dfed.png](https://i-blog.csdnimg.cn/blog_migrate/60c54323a68cd37326461490dd33037c.jpeg)
1.2 union all——包含重复值
![887e2b4b13f30251f0f3783d6f0b9a11.png](https://i-blog.csdnimg.cn/blog_migrate/bf4422a5cee51a86f4cfce7df50ae476.jpeg)
2.表的联结
![a8994c4059f64f7523530d6f87f05152.png](https://i-blog.csdnimg.cn/blog_migrate/918ac0080b353feeeb00f5138644c3be.jpeg)
![d92bcd2c782b92dbb5530cb0784fab78.png](https://i-blog.csdnimg.cn/blog_migrate/63630975f356fd599dcb74d7578e1dab.jpeg)
表的联结有以下5种:
- 交叉联结(cross join)
- 内联结(inner join)
- 左联结(left join)
- 右联结(right join)
- 全联结(full join)——此联结种mysql不适用
2.1 交叉联结(cross join)
交叉联结也称笛卡尔积,就是将表中的每一行都和另一个表中的每一行合并在一起。
![b87fba4935fa17b65ae048667dbeab11.png](https://i-blog.csdnimg.cn/blog_migrate/2186a1e1e28a48ba0c72690a6aad0a0a.jpeg)
2.2 内联结(inner join)
内联结即查找出同时存在于两表中的数据。
![9cec0f4d1e6b02014ceb3a62c582c770.png](https://i-blog.csdnimg.cn/blog_migrate/ab5398ff330b0c085cce183dac027a61.jpeg)
![d816719ee241dd25dcb20a806515c253.png](https://i-blog.csdnimg.cn/blog_migrate/fb8f43f400aba4ffac3e8cc87cb0baa9.jpeg)
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,左联结见下方方文图
![433c603b8478990dbfb437cb353d081c.png](https://i-blog.csdnimg.cn/blog_migrate/86afadec021fe61f104a7a012247d72c.jpeg)
![caa2ef983fd6f6bd14b20fa9ab5a405d.png](https://i-blog.csdnimg.cn/blog_migrate/6d9013a06f1d1901cb72d74f38a23dd1.jpeg)
其中:以下表示使用左联结仅留下左表不包含右表部分
select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号 = b.学号
where b.学号 = Null;
![5cfc14610907f81637ecf8e541992e88.png](https://i-blog.csdnimg.cn/blog_migrate/3a5f8ad35a965e783c76f3a5844cfd58.png)
2.4 右联结(right join)
右联结会将右侧表中的数据全都取出来联结左侧表的值,没有匹配的话生成null,右联结见下方方文图
![1e4bae33ced4c7785f1cb77513ddeb20.png](https://i-blog.csdnimg.cn/blog_migrate/91e2e487d482fe8a7004955939d38631.jpeg)
![5c9e3cf93888b9ab41648a26025bce33.png](https://i-blog.csdnimg.cn/blog_migrate/c54d81220177413bccab32fa93d6c1bd.jpeg)
其中:以下表示使用右联结仅留下左表不包含左表部分
select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号 = b.学号
where a.学号 = Null;
![8af3c1353c5a524fa7fd33c19f2e8ff2.png](https://i-blog.csdnimg.cn/blog_migrate/d9448e14f20003d14e51cd6c31fe0607.png)
2.5 全联结(full join)——此联结种mysql不适用
![e31a4dde4bc93d20543cab58e51624dd.png](https://i-blog.csdnimg.cn/blog_migrate/73b2d9590cf4294ab95866620b5d51ed.jpeg)
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.课程号;
![6e74268245f2c2702fb878eee63e7baf.png](https://i-blog.csdnimg.cn/blog_migrate/4db38ae4663535d571c5051920ad075f.jpeg)
4. case表达式
case表达式相当于条件判断函数,判断某一行是否满足判断条件,都不符合则运行else语句的内容。
![814fe1d069b9a7ae5f9034090b4eeedd.png](https://i-blog.csdnimg.cn/blog_migrate/639b32324dc4ecf3da979b256e913cb8.jpeg)
案例一:判断成绩是否及格,60分及以上为及格,60分以下为不及格
![57e4ebdf09658e577a92ad9c505dbf04.png](https://i-blog.csdnimg.cn/blog_migrate/4d48df7e1e67e4ab457111cc2b75e1a7.jpeg)
案例二:查询出每门课程的及格人数和不及格人数
![afa3b724648610f74ed0fddf6d377f9b.png](https://i-blog.csdnimg.cn/blog_migrate/059cc4843921c2bb6b4f504490feb76d.jpeg)
案例三:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各科成绩,分别统计分数段人数,课程号和课程名称
![ba5795034ec5e389782758d79482e2e8.png](https://i-blog.csdnimg.cn/blog_migrate/f90d5d602199fff3119a3bb4e64ea9a2.jpeg)