虽然立志成为一名数据分析师,但是Sql方面的知识已经忘得差不多了。由于最近比较有空,在日常学习外还会阅读《SQL进阶教程》这本书,学习后写博客记录。
CASE表达式
1.CASE表达式的分类
CASE表达式分为简单CASE表达式和搜索CASE表达式,二者形式如下:
--简单CASE表达式
CASE 博主
WHEN 会写SQL THEN 可以成为数据分析师
WHEN 会写JAVA THEN 也许可以成为数据分析师
ELSE 绝对不能成为数据分析师
END
CASE
WHEN 博主会写SQL THEN 可以成为数据分析师
WHEN 博主会写JAVA THEN 也许可以成为数据分析师
ELSE 绝对不能成为数据分析师
END
二者之间的区别显而易见,执行结果也一模一样,而简单CASE表达式可以做的事,搜索CASE表达式一定可以做到。
2.CASE表达式的注意事项
(1)注意WHEN子句的逻辑,防止出现某些子句不可能被执行的现象。
(2)各个WHEN子句和ELSE子句返回的数据类型应该相同(NULL除外,因为NULL在SQL中只是一个标记,而不属于任何数据类型)。
(3)不能忘记写END!!!!!!
(4)尽可能去写有实际意义的ELSE语句,如果不写,那么其默认返回NULL,这在很多情况下可能会给我们带来问题。
3.CASE表达式将已有编号方法转换为新的方式并统计
将上面的这张表,转换为下面的格式
在这种情况下,通常(即我能想到)的做法是,定义一个县和地区的对照表,通过两个表之间建立连接来进行聚合汇总。但是通过CASE子句也可以实现这个目标,而且省去了表连接的操作,其代码如下:
select case pref_name when '德岛' then '四国'
when '香川' then '四国'
when '爱媛' then '四国'
when '高知' then '四国'
when '福冈' then '九州'
when '佐贺' then '九州'
when '长崎' then '九州'
else '其他' end as district,
sum(population) as population_sum
from poptbl
group by case pref_name
when '德岛' then '四国'
when '香川' then '四国'
when '爱媛' then '四国'
when '高知' then '四国'
when '福冈' then '九州'
when '佐贺' then '九州'
when '长崎' then '九州'
else '其他' end;
乍一看这个语句,好像很难理解(至少我想了好一会),但是其实可以把整个CASE表达式看作一个“字段”,一个对应着各个县的地区字段,在这样一个字段的加入后,我们可以轻松地进行分组聚合。
4.用CASE语句进行不同条件的统计
把这张表统计为以下形式
在不用CASE语句的情况下,我的第一反应(当然书上也是这么写的)是将二者分开查询,即:
select pref_name,sum(population)
from PopTbl2
where sex = '01'
group by pref_name;
select pref_name,sum(population)
from PopTbl2
where sex = '02'
group by pref_name;
而通过CASE子句,则可以做到同时查询二者,即
select pref_name,
sum(case sex when 1 then population else 0 end) as '男',
sum(case sex when 2 then population else 0 end) as '女'
from poptbl2
group by pref_name;
书中有一句话说的有些扎心,新手用WHERE子句进行条件分支,高手用SELECT子句进行条件分支。
未完待续