case when嵌套子查询_case表达式用法总结

最近在磕《SQL进阶教程》第一章就总结了case表达式,有些用法之前练习的时候有刷到,但是没有深入的了解,这次刚好把这本书的提到的,结合做过的习题总结一下。

一、将已有编号方式转换为新的方式并统计

将数据按照某个类别进行分类统计的时候可以利用case表达式

eg:如果想要完成如下的转换

2bd0898b0f5915a029b4311c5cfb65fb.png

利用case表达式即可,具体的代码如下

f2ce19a421d01eef32fe09eef5aeb897.png

最终结果为

92ce33f424ff25d85b082cd03b874ab4.png

二、用一条SQL语句进行不同条件统计

case 表达式能够根据不同条件进行统计,能够将列结构的数据转换成行数据,这个技巧难能可贵的地方在于将SQL的查询结果变成二维表

作者的点评即“新手用where 句子进行条件分支,高手用select 句子进行条件分支"

比如(经典面试50 题)---- 35、查询所有学生的课程及分数情况;

c5ee68d54c1ac9dd4a314acc85a3042d.png

具体代码为

e11656eb3f63c798839d2d1b12ca929e.png

最终结果

1eafcb39876323a67c96dd216398e4f9.png

eg 2、(书后习题)

46c9f22eb8479de440a2b7c118e5e16c.png

具体代码

11632c0c24c487c3a1cfb27a4fa971f1.png

最后结果

68e8035384532f6e0bf083179b8872f9.png

三、用update进行条件分支

该应用场景需求为:以某数值型的列的当前在值为判断对象,将其更新为别的值,关键问题为这个时候update操作条件是多条语句,如果只是根据每个条件写一条update语句则会出现多次更新的情况即第一次更新的结果可能变成第二次更新的条件,会再次更新。

具体例子如下:

43538a08ea476059430134c58a6e8a20.png

此时应该考虑用update进行条件分支

具体代码如下

7ef75c4a13c7f33fd3cdd325d64b26be.png

结果为

dca764600aaf40ddcbba57ae87c09b70.png

四、表间数据的匹配

1、

case表达式的一大优势在于能够判断表达式,在case表达式里可以使用between,like,in等谓词,具有非常强大的表达能力

作者给出的例子

5775a5f9fdfbfcc14cb32a6a36e73187.png

具体的代码

36f8d5a663a4c4800ed4bfea82b62dee.png

结果

8c914e0f04c3e2832e623be4eb0796bb.png

应用根据经典面试50题

两个数据表,如果想要制作教师课表的话也可以仿照这个模式

具体如下表

25b0fe5fd6ebefc5ad00f1a50b5b5fec.png

具体SQL语句

2bc260b7cae85a7bfa3804111c740a15.png

最后结果

c4eb33ebaa68d04186e9039856cad181.png

2、嵌套的case 语句制作交叉表

具体的例子

839aaaa8e1cebb51027e0512cf70ece2.png

具体代码如下:(作者在嵌套的语句中使用的sum,我发现其实maxe也可以)

ad54f5f83fc63891eca95e18d20af28b.png

结果

bf779546491c9e712d2332b29f9c27fc.png

应用:如果将学生成绩表也变成学生选课表,看出哪些学生选学了课程

具体如下

5125458c5d5767d9ffccf972ee1c82a7.png

具体代码如下:

e0c46c8b511a7997cb1e38841238f568.png

最终的学生选课结果为

2a9d7594e13ab50e20610a1d09649c0e.png

五、case表达式中使用聚合函数

作者给出的例子是想要从学生加入社团的表中列出每个学生主要参加的社团,但是这些学生可有些参与一个社团(main_club_flg=N)能不止参与了一个社团(main_club_flg=Y or N)

ccd5b3d656dccac5b5dfd096d2fb755b.png

如果按照学生参与社团的个数分开来统计,则需要写多条语句,如果用case 表达式则精简很多。

ccd5b3d656dccac5b5dfd096d2fb755b.png

主要的逻辑case 条件分支就以学生的参与社团个数

若参与数为1(count(*)=1) 则直接输出社团号,否则为社团参与数不止一个

若他们参与的社团主标志为Y则输出社团号

62693e1a505c77832c3cd34f52d210c6.png

最后的结果

65b137dd6f5e398acf1da52c8333b009.png

作者的点评是新手用having语句进行条件分支,高手用select语句进行条件分支。