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

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

练习数据




java mysql链表多条件查询_中casewhen的用法


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


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

java mysql链表多条件查询_中casewhen的用法_02


一、表加法

两张表进行合并


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


java mysql链表多条件查询_java mysql链表多条件查询_03


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

三、inner join


java mysql链表多条件查询_Cross_04


java mysql链表多条件查询_MySQL_05


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


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


四、left join


java mysql链表多条件查询_执行顺序_06


java mysql链表多条件查询_中casewhen的用法_07


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


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


java mysql链表多条件查询_Cross_08


左连接的拓展问题


java mysql链表多条件查询_java mysql链表多条件查询_09


求差集,如果只想左连接找出如图所示的结果,非常简单,只需要对右表的关键字加个判断是否为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.学号


java mysql链表多条件查询_中casewhen的用法_10


六 out join


java mysql链表多条件查询_Cross_11


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


java mysql链表多条件查询_java mysql链表多条件查询_12


java mysql链表多条件查询_执行顺序_13


java mysql链表多条件查询_java mysql链表多条件查询_14


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

七 Case when

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


java mysql链表多条件查询_MySQL_15


java mysql链表多条件查询_执行顺序_16


java mysql链表多条件查询_执行顺序_17


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


java mysql链表多条件查询_中casewhen的用法_18


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


java mysql链表多条件查询_执行顺序_19


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


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


java mysql链表多条件查询_MySQL_20


整合结果如下


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


java mysql链表多条件查询_MySQL_21


java mysql链表多条件查询_执行顺序_22