1 表的加法
将两个表的数据按行合并在一起(删除重复的行):
![ef1483233df424f517f6561828fca176.png](https://i-blog.csdnimg.cn/blog_migrate/8a6c1b4fd606343cf1d0dc37060cea07.png)
2 表的联接
2.1 交叉联接(cross join)
将两个表通过交叉联接合并在一起:
![e85671bb81fd21ad6b811ade9b665345.png](https://i-blog.csdnimg.cn/blog_migrate/a5aa60eadb96734459f12f7f80228ce8.jpeg)
2.2 内联接(inner join):
![9b9c5e09771c6f90a5daf97890447518.png](https://i-blog.csdnimg.cn/blog_migrate/2b4897b2436a2d18a9cce6707a773d72.jpeg)
SQL语句:
![6714743b4e9022db76c5e7b1ceeaced7.png](https://i-blog.csdnimg.cn/blog_migrate/63328876e3880f077847191e1cede84d.png)
2.3 左联接(left join):
左边表格的内容全部取出,右边表格只取出主键列与左边表格有交叉的行
![e3a0d62fc6ac898a9c47aade635b5a7b.png](https://i-blog.csdnimg.cn/blog_migrate/6cc4975d7f79133d84d055140ceaab6b.png)
2.4 右联接(right join):
右边表格的内容全部取出,左边表格只取出主键列与左边表格有交叉的行
![93627f66a34b7250b6d26349cce24316.png](https://i-blog.csdnimg.cn/blog_migrate/ede35d68b97e946f73dfd369459534c5.png)
2.5 SQL的联接总结
![f6d9d215fb052d5a445ff719498fb74a.png](https://i-blog.csdnimg.cn/blog_migrate/ad5973eb37f5a9ce9ee46f1e68f3123e.jpeg)
3 联接应用实例
3.1 问题:查询所有学生的学号、姓名、选课数、总成绩。
1)将问题翻译成大白话:
学号、姓名可以从学生表student中查询;选课数即每个学生的选课数目是多少,选课信息可从成绩表score中查询,按学号进行分组,然后对课程号进行计数count;总成绩即每个学生的总成绩,可从成绩表score中查询,按学号进行分组,然后对成绩进行求和sum。
即查询所有学生的学号、姓名,每个学生的选课数目、每个学生的总成绩。
2)分析思路
SELECT 查询结果【学号,姓名,选课数,总成绩】
FROM 从哪张表查询【学生表student,成绩表score,两个表如何联接?通过学号 用哪种联接?左联接】
WHERE 查询条件【没有】
Group by 分组【每个学生的选课数目:按学号分组,对课程号计数count;每个学生的总成绩:按学号分组,对成绩求和sum】
HAVING 对分组指定条件【没有】
Order by 对查询结果排序【没有】
Limit 从查询结果中取出指定行【没有】
3)对应的SQL语句
SELECT a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩
FROM student as a LEFT JOIN score as b
on a.学号 = b.学号
GROUP BY a.学号;
4)运行结果
![5cda6f51b0d7ab6e8de65c4de7dea008.png](https://i-blog.csdnimg.cn/blog_migrate/1d134923429024240db94933a9b3f72c.png)
3.2 问题:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
即: 查询出所有学生的学号、姓名(从学生表student中查询),平均成绩(从成绩表score中查询,按学号分组,求平均成绩avg(成绩)),并对分组指定条件(平均成绩>85),两个表使用左联接(left join)。
对应的SQL语句及运行结果:
![d57e4f93483274cd7efa67bbb6fa45c4.png](https://i-blog.csdnimg.cn/blog_migrate/9f338d0ec7c69014e9a429527c50f9e3.png)
3.3 问题:查询学生的选课情况:学号,姓名,课程号,课程名称
查询学生的学号、姓名(从学生表student中查询),程号、课程名称(从课程表course中查询),学生表和课程表通过成绩表建立关系,学生表和成绩表通过学号联接,成绩表和课程表通过课程号联接。
对应的SQL语句及运行结果:
![3e67f61f8d0a1da12e89edf434d756cb.png](https://i-blog.csdnimg.cn/blog_migrate/300a1b0ec9cd9bec0104a8c3906eaecf.png)
4 case表达式
Case表达式的作用:相对于条件判断的函数,用来判断每一行是不是满足相应的条件。
4.1 表达式:
Case when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
……
Else<表达式>
End
4.2 查询学生的学号,课程号,成绩并判断成绩是否及格
![f728eab7696ae1eb586170c9d6b51b0d.png](https://i-blog.csdnimg.cn/blog_migrate/ac0d3c796fa5e7ee058d857fe70ab534.png)
4.3 查询出每门课程的及格人数和不及格人数
![869ebe19b22ee57e8555259e74c92a8a.png](https://i-blog.csdnimg.cn/blog_migrate/7e5e4fd694597e786c05824a32d909c0.png)
4.4 使用分段【100-85】,【85-70】,【70-60】,【<60】来统计各科成绩,分别统计各分数段人数、课程号、课程名称。
![afdf5203f829ae1edab73299a1c1543c.png](https://i-blog.csdnimg.cn/blog_migrate/6f0ca2a1d5c2296411c8aa1143729c3c.png)
5 sqlzoo练习
![10405f696eba522ff9f22cf89848c254.png](https://i-blog.csdnimg.cn/blog_migrate/7f72a71827af55778ca11c8c765dbae2.png)
![728110dfa871703cf6423035ba94f220.png](https://i-blog.csdnimg.cn/blog_migrate/26efb007f64f5763d3c11051af777c95.png)
![66757ac0f50971b33d6ebb3e71630267.png](https://i-blog.csdnimg.cn/blog_migrate/7d7b86d05f1544c03ea6c1ee896df2c8.png)
![4039a33cc2def42f0411498526aa9e27.png](https://i-blog.csdnimg.cn/blog_migrate/117f21e1fe0c0ee66eed7ad77e33306f.png)
![c45af311713d0cfa97f9da39e0d901b0.png](https://i-blog.csdnimg.cn/blog_migrate/4d6320f8da24541ad13d7c04939ac4cf.png)