一、表的加法不同连接的应用场景举例
在SQL中,通过union连接词实现多表相加
练习:如何合并两个表
union对于重复数据只保留其中一个:
![978252d89a703178f2d722d9d075fcf6.png](https://img-blog.csdnimg.cn/img_convert/978252d89a703178f2d722d9d075fcf6.png)
union all会将重复数据都进行保留:
![3bf8a8f6a9c47093b952a127aa7ec202.png](https://img-blog.csdnimg.cn/img_convert/3bf8a8f6a9c47093b952a127aa7ec202.png)
二、表的联结
当进行多个表查询的时候,需要通过联结进行。
在联结中,表和表之前是通过列产生对应关系的,联结是通过表和表之间的关系将两个表合并在一起的操作。
![fcee12709084c3fe7f55f8326a241e4e.png](https://img-blog.csdnimg.cn/img_convert/fcee12709084c3fe7f55f8326a241e4e.png)
常用的联结包括:
- 交叉联结(笛卡尔积):将一张表中的每一行都与另一张表中的每一行合并在一起。交叉联结结果的行数是两张表中行数的乘积
2. 内联结:选取出同时存在于两张表中的数据,关键词on后面的表示两张表通过哪个列匹配产生关系从而联结起来的
![59f33ffa6a3a0c0640606730a9911593.png](https://img-blog.csdnimg.cn/img_convert/59f33ffa6a3a0c0640606730a9911593.png)
![79192b02bd7ce3e4a5934e0a08bf6d04.png](https://img-blog.csdnimg.cn/img_convert/79192b02bd7ce3e4a5934e0a08bf6d04.png)
3. 左联结:将左侧表中的数据全部取出来。两个表进行左联结的时候,会将左侧的表作为主表,主表中的数据全部读取出来。
如果想要如下图所示的效果该怎么办呢?
![d6bef01e13e7ab2ccbab32e29d88bb8d.png](https://img-blog.csdnimg.cn/img_convert/d6bef01e13e7ab2ccbab32e29d88bb8d.png)
这是在左联结的基础上去掉了两张表中共同的地方,也就是去掉了两个圆圈的公共部分。在刚才左联结的sql语句中加入一个where子句,实现效果:
![4fb6dfbb571afc5b58abecc954b59e8a.png](https://img-blog.csdnimg.cn/img_convert/4fb6dfbb571afc5b58abecc954b59e8a.png)
4. 右联结:将右侧表中的数据全部取出来。两个表进行右联结的时候,会将右侧的表作为主表,主表中的数据全部读取出来。
![8885792a661487ea740835c702f0e237.png](https://img-blog.csdnimg.cn/img_convert/8885792a661487ea740835c702f0e237.png)
如果想要如下图所示的效果该怎么办呢?
![9f8cb5fc56f05cda459e4080d24a0f77.png](https://img-blog.csdnimg.cn/img_convert/9f8cb5fc56f05cda459e4080d24a0f77.png)
这是在右联结的基础上去掉了两张表中共同的地方,也就是去掉了两个圆圈的公共部分。在刚才右联结的sql语句中加入一个where子句,实现效果:
![2acb645bb7afeaad25fc44c66dc7f8b3.png](https://img-blog.csdnimg.cn/img_convert/2acb645bb7afeaad25fc44c66dc7f8b3.png)
5. 全联结
全联结的查询结果会返回左表和右表中的所有行,当某行和另一张表中的某行有匹配的时候,两个行进行合并;如果某一行和另一张表中没有匹配的行时,另一张表中的值对应的地方用空值来填充。
值得注意的是:MySQL不支持全连接
![6dad08fba3fc18c3341a7773ffd20cc4.png](https://img-blog.csdnimg.cn/img_convert/6dad08fba3fc18c3341a7773ffd20cc4.png)
- 当实际工作业务中想要生成固定行数的表单,或者特别说明了要哪一张表里的全部数据的 时候,会使用左联结或右联结
- 其他情况用内连接来获取两张表的公共部分
各联结文氏图表达:
![999c076357d1d8f0821c955e1f14fc48.png](https://img-blog.csdnimg.cn/img_convert/999c076357d1d8f0821c955e1f14fc48.png)
(字丑,见谅)
三、联结应用案例
利用联结解决实际业务中的问题
问题1:查询所有学生的学号、姓名、选课数目和总成绩
因为问题中需要查询的四个字段涉及到多个表(两张表),因此本题需要通过联结学生表和成绩表进行查询。
通过写分析思路(在各子句中写)来看如何把问题的每个部分对应到每个子句后面
注:用联结的时候要考虑到两个问题
a. 两个表如何联结?此题中两张表是通过学号来产生匹配关系的
b. 用哪种联结方式?因为要查到每个学生的信息,所以要保留左边学生表里的所有学号,因此用左联结。
把分析思路里的各个子句写成对应的sql,如下图:
![bc87387dc75a283fe87437666d92abd3.png](https://img-blog.csdnimg.cn/img_convert/bc87387dc75a283fe87437666d92abd3.png)
问题2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
问题可拆解为下图中两部分
接下来把分析思路里的各个子句写成对应的sql,首先写出第一部分对应的sql,如下图:
![63a94694a14684f87969742efce34c26.png](https://img-blog.csdnimg.cn/img_convert/63a94694a14684f87969742efce34c26.png)
在上面提到的分析思路中,第一步是查询出所有学生的学号、姓名和平均成绩。第二步是要平均成绩大于85分,所以现在应该把第二部分的条件加到上面的sql语句中去。而平均成绩是分组以后得到的,所以需要给分组结果加上条件,平均成绩大于85分用having子句。如下图:
![9fe8914f77d32209e1780b571db22df4.png](https://img-blog.csdnimg.cn/img_convert/9fe8914f77d32209e1780b571db22df4.png)
问题3:查询学生的选课情况:学号,姓名,课程号,课程名称
三张表联结的sql语句,其实就是在from子句中加入了多个join两两相连
![03d0a784087f2b9cd818689e22be4bdf.png](https://img-blog.csdnimg.cn/img_convert/03d0a784087f2b9cd818689e22be4bdf.png)
四、case表达式
使用case表达式可以帮助解决复杂的查询问题,当有多种情况需要条件判断的时候可以使用case表达式。case表达式的作用相当于一个进行条件判断的函数,用来判断某一行是否满足某一个条件。
case表达式的sql语句:
![006d0eeb831a33e3cbfca4c4072794d8.png](https://img-blog.csdnimg.cn/img_convert/006d0eeb831a33e3cbfca4c4072794d8.png)
其中when子句的判断表达式用来判断某行数据是否满足某个条件,
- 如果符合条件,就运行后面的then子句,则case表达式运行到此终止,不会运行后面的when子句了。
- 如果不符合某个条件,则进入下一个when子句。
- 如果直到最后的when子句也没有找到符合条件的数据,则会运行else中的表达式。
问题1:查询出每门课程的及格人数和不及格人数
![df820d8505f12f299f49c5d898738b78.png](https://img-blog.csdnimg.cn/img_convert/df820d8505f12f299f49c5d898738b78.png)
问题2:使用分段【100-85】,【85-70】,【70-60】,【<60】来统计各科成绩,分别统计各分数段人数,课程号和课程名称
![5e5e24d949774c374b9e372aa22cba1e.png](https://img-blog.csdnimg.cn/img_convert/5e5e24d949774c374b9e372aa22cba1e.png)
五、sql join练习题
![e2f212e7edf305cd610a8fb53c6f86f6.png](https://img-blog.csdnimg.cn/img_convert/e2f212e7edf305cd610a8fb53c6f86f6.png)
![46aa467f4cbe0f991c76694e847df665.png](https://img-blog.csdnimg.cn/img_convert/46aa467f4cbe0f991c76694e847df665.png)
![d50bc7e63bb8e80ae2b498685ab3c2b2.png](https://img-blog.csdnimg.cn/img_convert/d50bc7e63bb8e80ae2b498685ab3c2b2.png)
![db3a76ac867e3edde598036d76aa3c11.png](https://img-blog.csdnimg.cn/img_convert/db3a76ac867e3edde598036d76aa3c11.png)
![26f15996986b28c885f40f63af53fd4d.png](https://img-blog.csdnimg.cn/img_convert/26f15996986b28c885f40f63af53fd4d.png)
![9486fd7a6161470eb3c126dbde51bef1.png](https://img-blog.csdnimg.cn/img_convert/9486fd7a6161470eb3c126dbde51bef1.png)
![777c879cdf3a3ca62f38f7060c4e9ca4.png](https://img-blog.csdnimg.cn/img_convert/777c879cdf3a3ca62f38f7060c4e9ca4.png)
![a69ce1f8162bfd0ce7ea270f7f831bf5.png](https://img-blog.csdnimg.cn/img_convert/a69ce1f8162bfd0ce7ea270f7f831bf5.png)
![81b91f0924037c795af357042565e844.png](https://img-blog.csdnimg.cn/img_convert/81b91f0924037c795af357042565e844.png)
![632934f197bb65e5e76b22c3cb6de311.png](https://img-blog.csdnimg.cn/img_convert/632934f197bb65e5e76b22c3cb6de311.png)
![61ec08d9778c6fe372c01c2b12792c2e.png](https://img-blog.csdnimg.cn/img_convert/61ec08d9778c6fe372c01c2b12792c2e.png)
![0cd5481f39f14cee75e4f35baf7e4490.png](https://img-blog.csdnimg.cn/img_convert/0cd5481f39f14cee75e4f35baf7e4490.png)
![5ef850c099f5e26b6813dd2f785ab78d.png](https://img-blog.csdnimg.cn/img_convert/5ef850c099f5e26b6813dd2f785ab78d.png)
以上就是第五节课程《多表查询》的内容。