中casewhen的用法_MySQL 多表查询 "Join"+“case when”语句总结

本部分讲述:join系列全部总结和case when语句用法

join系列:表加法、Cross join 、inner join、left join、right join、full outer join

练习数据

5edf452e579d3d5284d2ed40885679f1.png

插入数据的代码,可以在这里直接复制:

绚丽的小海螺:从零学会SQL-入门(Navicat)​zhuanlan.zhihu.com
9bdb70216c3b67f699f1ad020a4766ef.png

一、表加法

两张表进行合并

select * from 
(select id,列名一, from table_1
union all
select id ,列名一,from table_2)
t;

union 和union all 的区别:union会去重并降低效率,union all直接追加。union前后是两端select语句而非结果集

二、Cross join

58a7af0b2b41adeef8bfc18b65be0a47.png

笛卡尔积如图,把所有笛卡尔连接的结果都展示出来,在实际应用中使用较少

三、inner join

26886e812fa3f66bf9b71c2913cd95af.png

0ea73c5eb3011ca3412aded1888b4e82.png

根据指定列取两个表都存在的做交叉联结

select a.学号,a.姓名,b.课程号 
from student as a
INNER JOIN
score as b
on a.学号 = b.学号

四、left join

c1eb7c8ed3917732b1692411edb5d22c.png

84c49a4fc7abe59bf57cd04580b48e3b.png

以左表为主,右表没有的信息被甜为空

select a.学号,a.姓名,b.课程号 
from student as a
LEFT JOIN
score as b
on a.学号 = b.学号

ef964488b3b69ec1337729f7fd439c45.png

左连接的拓展问题

0af0c2f4c626630ddf0012cf61980d22.png

求差集,如果只想左连接找出如图所示的结果,非常简单,只需要对右表的关键字加个判断是否为null

select a.学号,a.姓名,b.课程号 
from student as a
left JOIN
score as b
on a.学号 = b.学号
where b.学号 is Null;

五、right join

与left join相反

select a.学号,a.姓名,b.课程号 
from student as a
right JOIN
score as b
on a.学号 = b.学号

abdbcf016fb36c536ff9236658b8a583.png

六 out join

1a64b6ec30dcff4ed0f8178eafaa7343.png

外连接,即求两个集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。另外MySQL不支持OUTER JOIN,但是我们可以对左连接和右连接的结果做UNION操作来实现。

f8a4a17e68c4e0f71b4d836e6ff2d91f.png

f9cf1373c28ef96bd3a46c729490a7fb.png

d36b894e747f1e647534547a48b92956.png

连接后的筛选结果依然正常使用group by having等函数

七 Case when

case when 如何用?case when 在面试中十分常见,也十分使用

f8c0dd329eea75118efa6c1914ce1dfc.png

772a04b24a1a72457f0dd3e3b4b856ff.png

02dbbf6cf3e160fbe51b1a11748dc311.png

图中的序号代表执行顺序,意味着when的条件是互斥的。找到满足的条件则退出case 语句,但通常我们使用case语句是做汇总分析比如如下:

76812d63d806166500c539e41276d40c.png

使用0,1小技巧,先给表增加两列,再分组统计

060c95aedaee051347f266e09557e92a.png
SELECT 课程号,
case when 成绩>=60 then 1
else 0
end as 及格人数,
case when 成绩<60 then 1
else 0
end as 不及格人数
from score

生成如下结果,再进行分组统计

a6f78ca9f1afa71e916257ab1963d23e.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 when更为常见使用场景是分段统计

ddfa3037361b6fdf879f8176a4bdc853.png

25fd67b65afb65b50360b8d017db6b96.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值