1.表的加法
![a6591455c58bf1d436c490c5815a47e2.png](https://img-blog.csdnimg.cn/img_convert/a6591455c58bf1d436c490c5815a47e2.png)
2.表的连接
红色部分保留的是行
![b547bf260c689fc4f1ea28ae76bb35a8.png](https://img-blog.csdnimg.cn/img_convert/b547bf260c689fc4f1ea28ae76bb35a8.png)
交叉联结——表1所有的行与表2所有的行连接
![e8ef591051851a871c2f2c1e2f5a78b0.png](https://img-blog.csdnimg.cn/img_convert/e8ef591051851a871c2f2c1e2f5a78b0.png)
内联结 ——同时存在于两张表内的数据
![5cb67f40ed9502006dd6ab1296ea2fed.png](https://img-blog.csdnimg.cn/img_convert/5cb67f40ed9502006dd6ab1296ea2fed.png)
![a5af7be690d432c870ef972775912d9a.png](https://img-blog.csdnimg.cn/img_convert/a5af7be690d432c870ef972775912d9a.png)
左联结——将左侧表中数据全部取出
![1f1928b112371052e0fb02baed4bba23.png](https://img-blog.csdnimg.cn/img_convert/1f1928b112371052e0fb02baed4bba23.png)
![1daa2f1913f2402d42c5d4b61471e287.png](https://img-blog.csdnimg.cn/img_convert/1daa2f1913f2402d42c5d4b61471e287.png)
左联结去掉公共部分
![f1ef768c8690d50b57129fd9d736f742.png](https://img-blog.csdnimg.cn/img_convert/f1ef768c8690d50b57129fd9d736f742.png)
右联结——将左侧表中数据全部取出
![84f6ca227aa847c777905da55f30dbb3.png](https://img-blog.csdnimg.cn/img_convert/84f6ca227aa847c777905da55f30dbb3.png)
![362c94ea0c13bf5054f664f8157782bc.png](https://img-blog.csdnimg.cn/img_convert/362c94ea0c13bf5054f664f8157782bc.png)
右联结去掉公共部分
![7448d516ff1fe8575acbb8da0bcefd3c.png](https://img-blog.csdnimg.cn/img_convert/7448d516ff1fe8575acbb8da0bcefd3c.png)
全联结——MYSQL不支持全联结
![8e0a7b28166f524eb45c071830278474.png](https://img-blog.csdnimg.cn/img_convert/8e0a7b28166f524eb45c071830278474.png)
3.case表达式——解决复杂的查询问题,case的作用进行条件判断的函数,用来判断每一行是不是满足条件
case表达式 注意事项
else语句可以不写
end语句不可以不谢
case语句可以写在SQL语句的任一个子句中
![ecaf9da4ba229c55fb5ad9cbae1e7ec3.png](https://img-blog.csdnimg.cn/img_convert/ecaf9da4ba229c55fb5ad9cbae1e7ec3.png)
case when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
……
else<表达式>
end
SELECT 学号,课程号,成绩,
(CASE WHEN 成绩>= 60 THEN '及格'
WHEN 成绩< 60 THEN '不及格'
ELSE NULL
END ) AS 是否及格
FROM score;
查询出每门课程的 及格人数 和 不及格人数
![dcbe5c1d757887ab659e667a13006be7.png](https://img-blog.csdnimg.cn/img_convert/dcbe5c1d757887ab659e667a13006be7.png)
注意:千万不要忘记及格人数后面的逗号,
SELECT 课程号,
sum(CASE WHEN 成绩>= 60 THEN 1 ELSE 0 end) as '及格人数',
sum(CASE WHEN 成绩< 60 THEN 1 ELSE 0 end) as '不及格人数'
FROM score
GROUP BY 课程号;
case表达式 注意事项
else语句可以不写
end语句不可以不谢
case语句可以写在SQL语句的任一个子句中
![9325909db7eef4b6f34380478a8ddc03.png](https://img-blog.csdnimg.cn/img_convert/9325909db7eef4b6f34380478a8ddc03.png)
查询出每门课程的及格人数和不及格人数
![88a83930fc2369ad7c2fc5c9891005a8.png](https://img-blog.csdnimg.cn/img_convert/88a83930fc2369ad7c2fc5c9891005a8.png)
#使用分段[100-85],[85-70],[85-70],[70-60],[<60],来统计各分数段人数:课程ID和课程名称
SELECT a.课程号,b.课程名称,
sum(CASE WHEN 成绩 BETWEEN 85 AND 100 THEN 1 ELSE 0 end) as '[85,100]',
sum(CASE WHEN 成绩 >= 70 and 成绩< 85 THEN 1 ELSE 0 end) as '[70,85]',
sum(CASE WHEN 成绩 >= 60 and 成绩< 70 THEN 1 ELSE 0 end) as '[60,70]',
sum(CASE WHEN 成绩 <60 THEN 1 ELSE 0 end) as '[<60]'
FROM score as a RIGHT JOIN course as b on a.课程号=b.课程号
GROUP BY a.课程号,b.课程名称;
![d105a2b541c5467d9df59597e2a05ef4.png](https://img-blog.csdnimg.cn/img_convert/d105a2b541c5467d9df59597e2a05ef4.png)
联结应用案例练习
![3124d41d56a0877e69dd67a06987fd60.png](https://img-blog.csdnimg.cn/img_convert/3124d41d56a0877e69dd67a06987fd60.png)
三表联结
![0c095ea160c3b7c1adc06545d94e2c65.png](https://img-blog.csdnimg.cn/img_convert/0c095ea160c3b7c1adc06545d94e2c65.png)
![b8ae2aa12d1762056ecc28a4edd17575.png](https://img-blog.csdnimg.cn/img_convert/b8ae2aa12d1762056ecc28a4edd17575.png)
练习
1. 在进球表(goal)中查找德国球队(teamid = 'GER')进球的比赛编号(matchid),进球球员姓名(player)
![28f552329437e6183c4ce7270615ae41.png](https://img-blog.csdnimg.cn/img_convert/28f552329437e6183c4ce7270615ae41.png)
2. 在比赛信息表(game)查找比赛编号1012的信息
![ff5db4fea6ee65a5f375d21c6d5676fa.png](https://img-blog.csdnimg.cn/img_convert/ff5db4fea6ee65a5f375d21c6d5676fa.png)
3. 查找德国队进球球员姓名,球队编号(在进球信息表goal), 比赛地点,比赛日期(在比赛信息表game)
![8b00f57b416281b84e64d87f420ef60d.png](https://img-blog.csdnimg.cn/img_convert/8b00f57b416281b84e64d87f420ef60d.png)
4.查找姓名中以Mario开头的进球球员,符合条件球员参加比赛的对战双方
![e5791c36aa06d2837274fd73873a2d9c.png](https://img-blog.csdnimg.cn/img_convert/e5791c36aa06d2837274fd73873a2d9c.png)
5.查找进球球员的姓名、球队编号、教练、多长时间进球。要求多长时间进球<=10分钟
![b60b8cd5298fc513e485ddc6a68bfcd4.png](https://img-blog.csdnimg.cn/img_convert/b60b8cd5298fc513e485ddc6a68bfcd4.png)
6. 'Fernando Santos'作为教练的比赛日期,球队编号有哪些?
![02150873aeb3387c1cbd101ebd9e1194.png](https://img-blog.csdnimg.cn/img_convert/02150873aeb3387c1cbd101ebd9e1194.png)
7. 在比赛地点'National Stadium, Warsaw'有哪些进球球员?
![bd802d5e4df0cfa98a3a7b2990e74b31.png](https://img-blog.csdnimg.cn/img_convert/bd802d5e4df0cfa98a3a7b2990e74b31.png)
8.射入德国球门的球员姓名
![34dec640e07443d01c1240178cb3d658.png](https://img-blog.csdnimg.cn/img_convert/34dec640e07443d01c1240178cb3d658.png)
9.列出隊伍名稱 teamname 和該隊入球總數
![b165d191c43187a73baabb3a90f7aabd.png](https://img-blog.csdnimg.cn/img_convert/b165d191c43187a73baabb3a90f7aabd.png)
10. 查找出所有比赛地点,每个比赛地点的进球数
![119a71fd38ad4ada13052a0d0356e29a.png](https://img-blog.csdnimg.cn/img_convert/119a71fd38ad4ada13052a0d0356e29a.png)
11.查找出有波兰球队'POL'参加的比赛编号,比赛日期,对应这场比赛的进球数
![6245b72c3bcaae3cb7f35780d8e54e0c.png](https://img-blog.csdnimg.cn/img_convert/6245b72c3bcaae3cb7f35780d8e54e0c.png)
如果分组结果中没有比赛日期(mdate),而查询结果要求有比赛日期(mdate)。为了让查询结果中有比赛日期(mdate),我们在分组group by子句中再加上分组比赛日期(mdate)。
这时候group by a.id,a.mdate 有两个分组列,表示这两个列的值都相同时才算一组。因为比赛编号(id),比赛日期(mdate)都是一对一的,不会改变之前的分组结果,但有可以询结果中有分组中的列
12. 对于德国队'GER'得分的每场比赛,显示比赛编号,比赛日期和'GER'得分的进球数
![20d63daabbd2734775b4faf5fcdd603e.png](https://img-blog.csdnimg.cn/img_convert/20d63daabbd2734775b4faf5fcdd603e.png)
13. 查找出所有比赛的日期,每场比赛中对战双方各自的进球数(也就是team1进球数,team2进球数)
![6e8b297e0a4a3c4d9822ec6ce01a4e14.png](https://img-blog.csdnimg.cn/img_convert/6e8b297e0a4a3c4d9822ec6ce01a4e14.png)