SQL进阶-1-case语句
认真把SQL
语言提升下,选择了日本
的一本书籍。看过几本其他日本的IT人员写的书籍,发现他们好像有一个共同的特点,也是自己很喜欢而且一直坚持在使用的一点:多用图,将文字和图形结合起来
,比如:
- 《图解HTTP》
- 《图解机器学习》
- 《图解网站分析》
- 《图解TCP/IP》
都是将图像运用的淋漓尽致,看完之后很多知识点都会理解的更加透彻和记忆的更加深刻。
一般而言,日本人写的书比较实在
所以自己选择了这本《SQL进阶教程》,也是图文并茂的。本文中记录的是关于case
语句的用法
- 行列转换
- 已有数据的重分组和分类
- 与约束的结合使用
- 针对聚合结果的条件分支
2种方式
- 简单case表达式
- 搜索case表达式
1 | -- 简单 |
简单表达式能够写的搜索表达式都能写
注意事项
- 统一分支返回的数据类型
- 不要忘记写end
- 养成写else子句的习惯,虽然else子句是可选。如果不写,结果自动变成NULL
案例1-统计分组求和
需求
将表1的数据分组统计成表2,表1:
表2:
SQL实现
1 | -- 县编号转成地区编号 |
在有些数据库是不支持这种写法,但是在mysql中是可以顺利执行的:
- 先对select子句里面的列表进行扫描
- 再对列进行计算
不推荐使用!!!!!
案例2-数字大小分类
表格同上
需求
将不同的数字按照类别进行分组表示
SQL实现
1 | -- 按照人口数量等级划分 |
案例3-不同条件统计(男女)
需求
将表1统计成表2:根据县的不同,来统计每个县的男女人数
SQL实现
比较传统的做法是直接通过2条SQL语句来实现
1 | select pref_name, -- 统计每个县的男性人数 |
case实现:将行结构的数据变成了列结构的数据
1 | select pref_name, |
约束constraint
将case表达式和check约束结合起来,比如需求:女性员工的工资必须低于20万日元
1 | constraint check_salary check ( |
逻辑与蕴含式
在蕴含式中,要想P--->Q
为真,需要PQ同时为真,或者P为假,或者P的真假无法判定
案例4-update中使用case进行条件分支
需求
1 | 1.对当前工资为30万日元以上的员工,降薪10%。 |
SQL实现
1 | update salaries |
使用case调换主键值
1 | update someTable |
案例5-case嵌套子查询
需求
通过两张表生成第三张交叉表:
SQL实现
1 | -- in 实现 |
1 | -- exists实现 |
特点
- 这样的查询方式没有进行聚合,不需要排序
- 从性能上说,exists更好
案例6-case中使用聚合函数
需求
关于学生社团的表格:
- 只参加一个社团的学生的社团ID
- 参加了多个社团的学生的主社团ID,Y表示是主社团**
SQL实现
1 | -- 加入了一个社团 |
Case 语句实现
1 | select std_id, |
新手使用having进行分支,熟练之后可以使用select语句进行分支
总结
case
表达式可以写在select
子句里时,可以写在聚合函数内部,也可以是外部- 能够写列名和常量的位置,都可以使用
case
语句 case
表达式可以写在select、group by、having、where、order by
子句中case
表达式是一种表达式,而不是语句,具有更好的可移植性