前言:
今天的前言没什么好说的,你在开发中见过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位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言!