![1f3f179e2221b5f0903979f78d5fbe86.png](https://i-blog.csdnimg.cn/blog_migrate/37a6c89f87b582e6d7a2961461056316.png)
一、表的加法 Union
1. union的用法
l 单独用union时,合并后的表会删除重复数据
![c9a21039f4a1ab258442e1569de4d291.png](https://i-blog.csdnimg.cn/blog_migrate/90f02f48b07415ac55bd079c5bfb977e.png)
可见重复项‘0001 语文 0002’只保留了一项
![19cab690dc99648b526187bc2f661170.png](https://i-blog.csdnimg.cn/blog_migrate/b98784ff9cb0c6d824acbe23dd9f7476.png)
![062c4755f0a4dc1801a489b8124a9d48.png](https://i-blog.csdnimg.cn/blog_migrate/5db52cd4f9cd41d5099ab0da94905a13.png)
2. union的用法
用union all 时,合并后的数据会保留所有的值,不删除重复项
![402cbd0e749a204235930ab1abae896c.png](https://i-blog.csdnimg.cn/blog_migrate/146aa8d1c7e64dbb88e5edc34aa9bbfa.jpeg)
二、表的联结Join
1、交叉联结 cross join
表a中的每一行与表b中的每一行逐行联结,得到的联结后的表的行数=表a的行数*表b的行数
2、内联结 inner join
查找出同时存在于两张表中的数据,即两个表重叠的部分
设置别名,方便调用
![a64ddb8f5b9f6b796caacf2292d1a9b9.png](https://i-blog.csdnimg.cn/blog_migrate/6ce7f87d66e32a29b37e76c7c47c5812.png)
3、左联结 left join
将左边表的数据全部保留,右边表的数据取出与左边表相同部分的数据
![a6fc431f2bb8abe63a4da7822a33f658.png](https://i-blog.csdnimg.cn/blog_migrate/4f77b473d222adf795010a483224c2be.png)
4、右联结 right join
将右边表的数据全部保留,左边表的数据取出与右边表相同部分的数据
![e2502b70efa4fa2f5d4062ed60dc284c.png](https://i-blog.csdnimg.cn/blog_migrate/6ce8512be9277f725ac52c3a511ad5a9.jpeg)
三、如何用SQL解决业务问题
1、查询所有学生的学号、姓名、选课数和总成绩
分析思路:
学号、姓名信息student表中找
选课、成绩信息score表中找
统计每个学生的信息需要按学号分组
统计选课数需要用到count()函数
统计总成绩用到sum()函数
将学生信息与选课,成绩信息关联起来需要用到左联结left join
![cd8666e0e6b62ae5f55fea8ce60974b1.png](https://i-blog.csdnimg.cn/blog_migrate/587f3b425166307f3a3edfc6ecb3f78b.png)
2、查询平均成绩大于70的所有学生的学号、姓名和平均成绩
分析思路:
学号、姓名信息student表中找
选课、成绩信息score表中找
统计每个学生的信息需要按学号分组
平均成绩要用到avg()函数
平均成绩大于85,用到having字句
将学生信息与成绩信息关联起来需要用到左联结left join
![26c8bc426c282eaf66ab053ba9681a47.png](https://i-blog.csdnimg.cn/blog_migrate/b15839315ccf3deb64d2a6c59c386986.png)
3、查询学生的选课情况:学号,姓名,课程号,课程名称
分析思路:
学号、姓名信息student表中找
学生对应课程在score表中找
课程号、课程名称在course表中找
student表与score表通过‘学号’联结
score表与course表通过‘课程号’联结
![32c8cd70dd2a86ff4a4bb94353c15598.png](https://i-blog.csdnimg.cn/blog_migrate/b7d47bb130e0438aaea1e8ee0d3c1722.jpeg)
四、case表达式
当when...时执行then后面的表达式,相当于if...then...
case when<判断表达式> then <表达式>
when<判断表达式> then <表达式>
when<判断表达式> then <表达式>
...
else <表达式>
end
1、查询出每门课程的及格人数和不及格人数
分析思路:
用case 表达式将成绩<60设定为不及格,成绩>=60设为及格;
查询每门课程的及格与不及格人数,按每门课程分组group by
l 因为涉及到了case表达式,不能直接用count函数统计及格与不及格人数,所以
当when成绩<60时,then后面的值设为1,else则为0,再通过sum()函数得出不及格的数量
当when成绩>=60时,then后面的值设为1,else则为0,再通过sum()函数得出及格的数量
![fa7bdb0931ef45d1a52cb61e18b926bf.png](https://i-blog.csdnimg.cn/blog_migrate/20352d4455b26d04608a4df20310b0a0.jpeg)
2、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
分析思路:
因为涉及各科成绩,用right join通过课程号联结两个表
使用case表达式结合sum函数统计各分数段的人数
分数在score表中找
课程号和课程名称在course表中找
![0594f1f77927424cf1d83b5b4c7155ba.png](https://i-blog.csdnimg.cn/blog_migrate/19de44bb2e0a815ea850011ae9867ce5.jpeg)
五、SQLZOO 练习
![565ec9e76ced778972130036a99bdf80.png](https://i-blog.csdnimg.cn/blog_migrate/98e52cbb4c755412729bada92e423a51.png)
![b146b25948a1e983c11b43b4ec31019e.png](https://i-blog.csdnimg.cn/blog_migrate/fdd74a237adc133a464bc5ce13162e51.png)
![cc2bfa31fa0847e11da5356939f63b3d.png](https://i-blog.csdnimg.cn/blog_migrate/581607db12f4580b0dea802c3c760d34.png)
![b7250137a3d996bf52bb7d4a9e127ba0.png](https://i-blog.csdnimg.cn/blog_migrate/5cc4d73d15f3388fdc0c04a9b62dc6aa.png)
![eab84b2ea15f57c9dcebbe8cf0e7db8b.png](https://i-blog.csdnimg.cn/blog_migrate/f52218b9a7cc3f50f8db40f647bbe057.png)
![73200b583a68e1c13a783ec532a25a14.png](https://i-blog.csdnimg.cn/blog_migrate/0de410b4dfb4c6300d7632dc739e43cf.png)
![bea971a5707a9f4b099530847d40dce4.png](https://i-blog.csdnimg.cn/blog_migrate/4854ed0025976e233dcabaeebc6df5ff.png)
![83b98c99f7a6d871af3efdec40a6175f.png](https://i-blog.csdnimg.cn/blog_migrate/05e6b8a1789315cbf6a2157391115a9b.png)
![b26bb68e6122a9f42afeee8b42f3787f.png](https://i-blog.csdnimg.cn/blog_migrate/6f0a950f0e874a0f044cb21557e2ba46.png)
![3fb33ccf2316e5882525a03d1a3e0532.png](https://i-blog.csdnimg.cn/blog_migrate/07e5a08421e282c4051bd9c01b3e5844.png)
![b37e5fce49702de51ca60fc8ce81a18b.png](https://i-blog.csdnimg.cn/blog_migrate/f1d7c649c0ae41d76c0bc130b90a15b5.png)
![977b70d30e984dfaea282526adc0ead1.png](https://i-blog.csdnimg.cn/blog_migrate/98d41ccbafaa746fb921b5c33f6a7c1a.png)
![3d3b2ff2ac912b1dfdeab958a4707bd1.png](https://i-blog.csdnimg.cn/blog_migrate/549ddf004da3e5c9b9be42d54d9aa58f.png)
问题和需要注意的地方:
1. 分析业务问题前先理清楚业务逻辑,从哪些表找数据,用哪种种联结方法
2. SQLZOO 第10题有陷阱, 列出该场馆和该场馆的进球看似很简单,用inner join 就错了, 要得出该场馆所有的进球数据应该用左联结,且进球数据一定要统计到每个球员