SQL case when 语句解析

▼魔方 西西 提交于 2020-04-07 07:00:42

一,原始单表(也是从其他博客看到)及其查询后效果。

原始表:

查询后(要求查询后按照洲统计人口):

二,SQL探讨

*初始化insert语如下:

INSERT INTO cptable VALUES (NULL ,'中国',600);

INSERT INTO cptable VALUES (NULL ,'美国',100);

INSERT INTO cptable VALUES (NULL ,'加拿大',100);

INSERT INTO cptable VALUES (NULL ,'英国',200);

INSERT INTO cptable VALUES (NULL ,'法国',300);

INSERT INTO cptable VALUES (NULL ,'日本',250);

INSERT INTO cptable VALUES (NULL ,'德国',200);

INSERT INTO cptable VALUES (NULL ,'墨西哥',50);

INSERT INTO cptable VALUES (NULL ,'印度',250);

*SQL查询语句

表达方式A:

SELECT  SUM(population),
CASE country
WHEN '中国'     THEN '亚洲'
WHEN '印度'     THEN '亚洲'
WHEN '日本'     THEN '亚洲'
WHEN '美国'     THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他' END
FROM    cptable
GROUP BY CASE country
WHEN '中国'     THEN '亚洲'
WHEN '印度'     THEN '亚洲'
WHEN '日本'     THEN '亚洲'
WHEN '美国'     THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他' END;

表达方式B:

SELECT sum(population) AS population,
  (CASE
    WHEN country IN ('中国','日本','印度')THEN '亚洲'
    WHEN country IN ('加拿大','美国','墨西哥') THEN  '北美洲'
    else '其他' end) AS area
FROM cptable GROUP BY area;

        得出的结果都正确的,当我看到其他博客写的是表达方式A的时候,个人感觉特别繁琐,并不是说表达方式A中的多个when then 语句,而是 group by 前后都写了同样的SQL代码;让我们一起学习case when语句的方法,case when 语句其实就是在查询出来原始表后再做处理,添加新的列表,新增的列中的值以原始表列值为基础进行计算显示;

例如执行以下SQL:

SELECT cptable.country AS country,cptable.population AS population,
  (CASE
    WHEN country IN ('中国','日本','印度')THEN '亚洲'
    WHEN country IN ('加拿大','美国','墨西哥') THEN  '北美洲'
    else '其他' end) AS area
FROM cptable;

得到的结果如下:

        以上查询结果,一共有三列,分别为country,population, area。白色方框中的数据和原始表并无区别,而area这一列是自定义的,可以说是原始表结果的一个扩展信息。

        我们可以试着这样去理解,当数据库查询出原始数据第一行并想填充area这一列的时候发现该行country列为中国,根据自定义的when case语句 ,该行的area列只能填充‘亚洲’这个value;类似通过函数area = f(country,population),以数据表行为基础这一个维度,通过已有条件来设置新列的值,以此类推,数据库查询扫描第二行,根据自定义when case的规则得出结果area只能赋值‘北美洲’。。。。。。

我们查询显示时候,隐去不需要被看到的结果集如country列,然后group by area 通过area分组,SUM函数得到每组的总数,最后得出正确结果;



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!