SQL case when 語句解析

一,原始單表(也是從其餘博客看到)及其查詢後效果。數據庫

原始表:函數

查詢後(要求查詢後按照洲統計人口):學習

二,SQL探討
spa

*初始化insert語以下:code

INSERT INTO cptable VALUES (NULL ,'中國',600);博客

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

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

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函數獲得每組的總數,最後得出正確結果;