1.表的加法(union)
select 课程号,课程名称
from course
union
select 课程号,课程名称
from course1;
union会删除重复行,如果想保留,应使用
union all
2.表的联结
联结类型:cross join, inner join, left join, right join, full join
- cross join 交叉联结
![51ed86aae6d241b9be9ff5ffbc4444c0.png](https://img-blog.csdnimg.cn/img_convert/51ed86aae6d241b9be9ff5ffbc4444c0.png)
- inner join 内联结
输出的是两个表中都存在的相同列数据(下图中的学号,只有0001在两边都有)
![1f8a08ab5e8995ea4154489383e36a63.png](https://img-blog.csdnimg.cn/img_convert/1f8a08ab5e8995ea4154489383e36a63.png)
select a.学号,a.姓名,b.课程号
from student as a inner join score as b
on a.学号 = b.学号
- left join 左联结
以左侧的表为主,取出左侧表全部数据,只取出右侧表中存在于左侧表的数据,进行交叉联结
![6f54c4836471b421edb95a38b7c9bd79.png](https://img-blog.csdnimg.cn/img_convert/6f54c4836471b421edb95a38b7c9bd79.png)
select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号 = b.学号
如果只想输出仅存在于左侧表的数据添加子句:
where 右侧表.列名=Null
![1858c40d1a5245aee3bf3d78892fc2e7.png](https://img-blog.csdnimg.cn/img_convert/1858c40d1a5245aee3bf3d78892fc2e7.png)
- right join 右联结
以右侧的表为主,取出右侧表全部数据,只取出左侧表中存在于右侧表的数据,进行交叉联结
select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号 = b.学号
select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号 = b.学号
where a.学号 = Null;
- full join 全联结(mysql不支持全联结!)
输出全部存在于两侧表的数据,如果一边数据不存在于另一边,则仍以null输出
- 总结:
![b4a6b383b32fae3f3c017135993cdb9e.png](https://img-blog.csdnimg.cn/img_convert/b4a6b383b32fae3f3c017135993cdb9e.png)
3.联结应用案例
![75a1b63570980494b514d6273dfa9f48.png](https://img-blog.csdnimg.cn/img_convert/75a1b63570980494b514d6273dfa9f48.png)
注意:最后要在select子句中加入每列数据对应的表的别名
![52212f0076ae16246154c2f6f45f9387.png](https://img-blog.csdnimg.cn/img_convert/52212f0076ae16246154c2f6f45f9387.png)
![c29f2020f36a6b050e69b405adc2c66b.png](https://img-blog.csdnimg.cn/img_convert/c29f2020f36a6b050e69b405adc2c66b.png)
4.case表达式
case when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
...
else <表达式>
end
依次判断《判断表达式》是否符合,若符合直接跳出case,否则执行下一个when子句,直到所有when子句都不符合,则执行else子句
示例:
select 学号,课程号,成绩,
(case when 成绩>=60 then ‘及格’
when 成绩<60 then ‘不及格’
else null
end )as 是否及格
from score;
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 课程号;
注意事项:
- else语句可以不写,但是end不能不写
![87694d37e800b26bb85957d82242f24f.png](https://img-blog.csdnimg.cn/img_convert/87694d37e800b26bb85957d82242f24f.png)
SQLZOO练习记录
The JOIN operation/zh
![f6f4472194bd05784d29eee9e233cc2b.png](https://img-blog.csdnimg.cn/img_convert/f6f4472194bd05784d29eee9e233cc2b.png)
![a51cc032a11e7b99dd49a82ca7633d64.png](https://img-blog.csdnimg.cn/img_convert/a51cc032a11e7b99dd49a82ca7633d64.png)
![50e44d304454e9382444303f661af762.png](https://img-blog.csdnimg.cn/img_convert/50e44d304454e9382444303f661af762.png)
![c2c8f2f26fcbcdac53174e40e82d0b8a.png](https://img-blog.csdnimg.cn/img_convert/c2c8f2f26fcbcdac53174e40e82d0b8a.png)
![3858f1da36b5c8c48be9187d08b3894d.png](https://img-blog.csdnimg.cn/img_convert/3858f1da36b5c8c48be9187d08b3894d.png)
![fe5836bfc5a2e030d7a9c0571f289f8c.png](https://img-blog.csdnimg.cn/img_convert/fe5836bfc5a2e030d7a9c0571f289f8c.png)
注意第十一题,因为要输出 id 和 mdate,分组的时候,需要也把mdate分组否则就不会保留这一行数据
![0629fd151f4977c0b13a0ffd60b1f71a.png](https://img-blog.csdnimg.cn/img_convert/0629fd151f4977c0b13a0ffd60b1f71a.png)
一开始想设计team1和team2用or并列筛选ger,但实际上不需要这么复杂,只要筛选goal中含有ger的就可以了
![f6f1b1a3f20043a8965f644a388f39db.png](https://img-blog.csdnimg.cn/img_convert/f6f1b1a3f20043a8965f644a388f39db.png)
13题很复杂,可以多多复习,注意不能用inner join,因为如果两边都没有进球,就不会被放在总表里
case when的使用很灵活,要多加思考