本部分讲述:join系列全部总结和case when语句用法
join系列:表加法、Cross join 、inner join、left join、right join、full outer join
练习数据
插入数据的代码,可以在这里直接复制:
绚丽的小海螺:从零学会SQL-入门(Navicat)zhuanlan.zhihu.com
一、表加法
两张表进行合并
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
笛卡尔积如图,把所有笛卡尔连接的结果都展示出来,在实际应用中使用较少
三、inner join
根据指定列取两个表都存在的做交叉联结
select a.学号,a.姓名,b.课程号
from student as a
INNER JOIN
score as b
on a.学号 = b.学号
四、left join
以左表为主,右表没有的信息被甜为空
select a.学号,a.姓名,b.课程号
from student as a
LEFT JOIN
score as b
on a.学号 = b.学号
左连接的拓展问题
求差集,如果只想左连接找出如图所示的结果,非常简单,只需要对右表的关键字加个判断是否为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.学号
六 out join
外连接,即求两个集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。另外MySQL不支持OUTER JOIN,但是我们可以对左连接和右连接的结果做UNION操作来实现。
连接后的筛选结果依然正常使用group by having等函数
七 Case when
case when 如何用?case when 在面试中十分常见,也十分使用
图中的序号代表执行顺序,意味着when的条件是互斥的。找到满足的条件则退出case 语句,但通常我们使用case语句是做汇总分析比如如下:
使用0,1小技巧,先给表增加两列,再分组统计
SELECT 课程号,
case when 成绩>=60 then 1
else 0
end as 及格人数,
case when 成绩<60 then 1
else 0
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 课程号
case when更为常见使用场景是分段统计