前言:
今天的前言沒什麼好說的,你在開發中見過case-when-then else end 那你就知道某些場景很好用,沒見過的很可能很多時候你會用連表查的方式解決類似的問題。這篇文章就告訴大家case when 的一些基礎用法,讓大家感受下它的好用之處。
正文:
一、我們先舉個例子
1.建表語句
-- 班級表
CREATE TABLE example(
id VARCHAR(20),
name VARCHAR(20),
birthday VARCHAR(20),
sex VARCHAR(3),
grade VARCHAR(20)
);
2.插入數據的語句
INSERT INTO `example` VALUES ('1', '小明', '1998-08-09', '1', '一年級');
INSERT INTO `example` VALUES ('2', '小紅', '1998-08-09', '2', '一年級');
INSERT INTO `example` VALUES ('3', '小亮', '1998-08-09', '1', '一年級');
INSERT INTO `example` VALUES ('4', '小華', '1998-08-09', '1', '一年級');
INSERT INTO `example` VALUES ('5', '小陳', '1998-08-09', '1', '二年級');
INSERT INTO `example` VALUES ('6', '小達', '1998-08-09', '2', '二年級');
INSERT INTO `example` VALUES ('7', '小打', '1998-08-09', '1', '二年級');
INSERT INTO `example` VALUES ('8', '小噠', '1998-08-09', '2', '二年級');
INSERT INTO `example` VALUES ('9', '達達', '1998-08-09', '2', '二年級');
3.業務場景:要求按每個年級統計男生和女生的數量各是多少,統計結果的表頭爲,年級,男生數量,女生數量。(大家可以先不看後面的思路,自己寫寫,看看寫出的sql語句是什麼樣子的,然後和我給出的進行對比,看看那個好些。)
------------------------------------------------------------------答題開始-----------------------------------------------------------------------------------
------------------------------------------------------------------答題結束-----------------------------------------------------------------------------------
4.我先公佈第一種答案,看看和大家的是否相同或思路類似
SELECT
a.grade AS 年級,
a.男生數量,
c.女生數量
FROM
(
SELECT
a1.grade,
count(*) AS 男生數量
FROM
example AS a1
WHERE
a1.sex = '1'
GROUP BY
a1.grade
) AS a
LEFT JOIN (
SELECT
a2.grade,
count(*) AS 女生數量
FROM
example AS a2
WHERE
a2.sex = '2'
GROUP BY
a2.grade
) AS c ON a.grade = c.grade
5.公佈case when寫法的答案
SELECT
grade as 年級,
COUNT(
CASE
WHEN sex = 1 THEN
1
ELSE
NULL
END
) 男生數量,
COUNT(
CASE
WHEN sex = 2 THEN
1
ELSE
NULL
END
) 女生數量
FROM
example
GROUP BY
grade;
二、講解條件判斷語句case when 的用法
1.case when具有兩種個格式
--簡單Case函數
case 字段 when 值 then 返回值 when 值2 then 返回值2 end
--舉例
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函數
case when 條件1 then 返回值1 when 條件2 then 返回值2 end
--舉例
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
2.兩者主要的區別
簡單case函數的寫法相對比較簡潔,但是和 case搜索函數相比,功能方面會有些限制,沒有搜索函數再寫條件的時候更加靈活。
3.case when的用法
Case函數只返回第一個符合條件的值,剩下的Case部分將會被自動忽略。Case when 相當於一個自定義的數據透視表,group by 是行名,case when 負責列名。
4.舉個小例子
建表語句
-- 國家人口性別表
CREATE TABLE shiyan(
country_name VARCHAR(20),
s_sex VARCHAR(20),
population VARCHAR(20)
);
插入數據語句
INSERT INTO `shiyan` VALUES ('中國', '1', '340');
INSERT INTO `shiyan` VALUES ('中國', '2', '260');
INSERT INTO `shiyan` VALUES ('美國', '1', '45');
INSERT INTO `shiyan` VALUES ('美國', '2', '55');
INSERT INTO `shiyan` VALUES ('加拿大', '1', '51');
INSERT INTO `shiyan` VALUES ('加拿大', '2', '49');
INSERT INTO `shiyan` VALUES ('英國', '1', '40');
INSERT INTO `shiyan` VALUES ('英國', '2', '60');
業務場景:按照國家和性別進行分組,sql語句
select a.country_name,
sum(case WHEN a.s_sex ='1' THEN a.population else 0 END )as 男,
sum(case WHEN a.s_sex ='2' THEN a.population else 0 END) as 女
FROM shiyan as a
GROUP BY
a.country_name
執行結果:
總結:
希望大家通過上面的例子可以初步瞭解case when的使用方法,如果覺得還不熟練,就趕緊多寫幾個例子吧!我們在實際開發中,不能僅僅止步寫出sql,還要考慮如何寫出性能和效率的sql,所以sql優化和性能測試,應該時刻去關注和學習,sql優化好了在面試中還能幫你很大的忙。
我是阿達,一名喜歡分享知識的程序員,時不時的也會荒腔走板的聊一聊電影、電視劇、音樂、漫畫,這裏已經有382位小夥伴在等你們啦,感興趣的就趕緊來點擊關注我把,哪裏有不明白或有不同觀點的地方歡迎留言!