一、表的联合
union 将两张表联合成为一张表并且会去掉重复数据
union all将两张表联合成为一张表并且不会去掉重复数据
![3a1a4106b9acd44011425004d30b003f.png](https://img-blog.csdnimg.cn/img_convert/3a1a4106b9acd44011425004d30b003f.png)
![2d7e3935632ba8293062aceb30d63586.png](https://img-blog.csdnimg.cn/img_convert/2d7e3935632ba8293062aceb30d63586.png)
二、表的联结
联结关系图
![ed2ceba9105718e738b49f3cfc3a5254.png](https://img-blog.csdnimg.cn/img_convert/ed2ceba9105718e738b49f3cfc3a5254.png)
常用的联结:cross join、inner join、left join、right join、full join几种
![adec28f121f98af89702c9b2b95dc572.png](https://img-blog.csdnimg.cn/img_convert/adec28f121f98af89702c9b2b95dc572.png)
1.交叉联结(cross join)笛卡尔积:表1的数据和表2的数据逐一进行组合,共生成的数据总数等于(表1数据总数)与(表2数据总数)的乘积,需要大量的运算
2.内联结(inner join):用于查找同时存在于两张表中的数据,当表1和表2中仅有一列列名一 致,用于查找对应列名的数据时,可以使用 natural join 达到相同效果,省略on 表1.列名=表2.列名
![9c5c7170265414d90aa2415eabb68c85.png](https://img-blog.csdnimg.cn/img_convert/9c5c7170265414d90aa2415eabb68c85.png)
![5e12a1d571d6f1d11401e53d43df36bb.png](https://img-blog.csdnimg.cn/img_convert/5e12a1d571d6f1d11401e53d43df36bb.png)
3.左联结(left join):两个表进行匹配关系,将左侧的表作为主表读取全部数据和右表中的数据进行交叉联结,未匹配成功的数据显示为NULL
![d26a2fd4cf3f33e6462cf880f4d1212e.png](https://img-blog.csdnimg.cn/img_convert/d26a2fd4cf3f33e6462cf880f4d1212e.png)
可找到仅存在于左表中的数据,不与右表中的数据重合部分
![90af620cf7b3487725887b6980395577.png](https://img-blog.csdnimg.cn/img_convert/90af620cf7b3487725887b6980395577.png)
4.右联结(right join):同理右侧的表作为主表读取全部数据与左表中的数据进行交叉联结,未匹配成功的数据显示为NULL,查找仅存在于右表中的数据可使用where 左表中数据为NULL(未匹配成功的数据),进行查找
![168db9d3403cca2d10bb050649cd066d.png](https://img-blog.csdnimg.cn/img_convert/168db9d3403cca2d10bb050649cd066d.png)
![008211302840849d12f51df55444dffe.png](https://img-blog.csdnimg.cn/img_convert/008211302840849d12f51df55444dffe.png)
5.全联结(full join):查询结果返回左表与右表中所有行,匹配成功合并,匹配失败显示NULL(MYSQL不支持)
三、练习
1.查询所有学生的学号、姓名、选课数、总成绩
分析:学号存在于student表和score表中,姓名存在于student表中,选课数需要先对score表中学号group by再计算课程号count总和,总成绩需要先对score表中学号group by再计算sum成绩,需要返回所有学生所以使用student left join score
![49fd828f947c6e89acafd1c65fba57e1.png](https://img-blog.csdnimg.cn/img_convert/49fd828f947c6e89acafd1c65fba57e1.png)
2.查询平均成绩大于85的所有学生的学号、姓名、平均成绩
分析:学号存在于student表和score表中,姓名存在于student表中,平均成绩是对score表中的学号group by再对分组后的avg求出平均成绩,用比较运算>85得出结果
![f32daab6d7f12a432beef107def36b50.png](https://img-blog.csdnimg.cn/img_convert/f32daab6d7f12a432beef107def36b50.png)
3.查询学生的选课情况:学号、姓名、课程号、课程名称
分析:学号和姓名存在于student表中,学号和课程号存在于score表中,课程号和课程名称存在于course表中,student表和score表通过学号进行联结,course表和score表通过课程号进行联结
![6c39e0ac94af73902ce2610307d45a2e.png](https://img-blog.csdnimg.cn/img_convert/6c39e0ac94af73902ce2610307d45a2e.png)
四、case 表达式:多种条件进行判断
case when <判断表达式> then<表达式>...
else<表达式>
end
![c49e68590bbff9274c02e4dc6dab26cc.png](https://img-blog.csdnimg.cn/img_convert/c49e68590bbff9274c02e4dc6dab26cc.png)
![f08f8bfecdfb32c3ab206515d63669bf.png](https://img-blog.csdnimg.cn/img_convert/f08f8bfecdfb32c3ab206515d63669bf.png)
![16e966a0156a6c43734be39130349ef4.png](https://img-blog.csdnimg.cn/img_convert/16e966a0156a6c43734be39130349ef4.png)
五、SQLZOO
使用sum和case when 同时使用,可得到某一数据出现的总和,group by可对最终select出的数据进行逐一分组确保数据可返回
![616c319d747b2558aa48ac1d3914cdbe.png](https://img-blog.csdnimg.cn/img_convert/616c319d747b2558aa48ac1d3914cdbe.png)
分析:POL参与的赛事可在主场和客场的 team1 或team2中找到,而GER进球数则要在goal表中获取进球数据
![c6b197a7f52af7459301c09e50027cf4.png](https://img-blog.csdnimg.cn/img_convert/c6b197a7f52af7459301c09e50027cf4.png)
分析:需要返回某一表中全部数据则使用left join 或 right join
![72a5561ceabf585388700d7775667b85.png](https://img-blog.csdnimg.cn/img_convert/72a5561ceabf585388700d7775667b85.png)