流程控制:case when

本文介绍了SQL中的Case语法,包括用于区间判断和等值判断的两种用法,通过具体实例展示了如何根据不同条件进行数据分类及汇总统计。

###1.定义
在编程语言中我们通过switch语句或者if-else if语句可以实现程序的流程控制。在sql语句中使用case 语法同样可以实现流程控制的效果。

###2.用法
####2.1用于实现区间的判断
第一种用法用于实现区间的判断,类似Java中的switch语句;模板语法如下
CASE 变量|表达式|字段 WHEN 要判断的值1 THEN 返回的值1或语句1 WHEN 要判断的值2 THEN 返回的值2或语句2 ... ELSE 要返回的值或者语句n END

执行的逻辑:如果when中的值满足或者条件成立,则执行对应then后面的语句,并结束case语句块。如果所有的when语句都不满足,则执行else中的语句。

下面举个栗子:

数据准备:现在有如下的一张表(用户id、用户名、性别、成绩)
这里写图片描述

需求:蟹老板说:豆豆你刚来,给你个简单的任务热热身吧!写个sql 根据用户的分数来划分等级,输出用户信息。如果分数小于60分的不及格,在60到70之间等级为C70到80之间等级为B80到100之间的就厉害点等级为A。豆豆掉了几根头发终于写出下面的sql语句。

SELECT id,username,sex,score,
	CASE 
		WHEN score>=80 AND score<=100 THEN 'A'
		WHEN score>=70 THEN 'B'
		WHEN score>=60 THEN 'C'
		ELSE '不及格'
	END AS '分数等级'
FROM test_tb;

输出结果:
这里写图片描述


####2.2用于等值判断
第二种用法用于等值判断,有点像Java中的if语句;模板语法如下
CASE 变量|表达式|字段 WHEN 要判断的值1 THEN 返回的值1或语句1 WHEN 要判断的值2 THEN 返回的值2或语句2 ... ELSE 要返回的值或者语句n END

执行的逻辑:如果when中的值满足或者条件成立,则执行对应then后面的语句,并结束case语句块。如果所有的when语句都不满足,则执行else中的语句。

下面再举个栗子

数据准备:还是上面的那个表
这里写图片描述

需求:蟹老板:哎呦不错,看来你还会用case语法,那下午别摸鱼了在再写个sql玩玩:用case实现 当sex为1输出man,sex为0输出women,豆豆很争气这次只是掉了两条头发就写出了下面的sql语句

 SELECT id,username,sex,
	CASE sex
		WHEN 1 THEN 'man'
		WHEN 0 THEN 'women'
		ELSE '保密'
	END AS '性别'
FROM test_tb;

输出结果:

这里写图片描述


当使用第一种写法同样是可以实现相同的效果,sql语句和输出结果如下

SELECT id,username,sex,
	CASE 
		WHEN sex = 1 THEN 'man'
		WHEN sex = 0 THEN 'women'
		ELSE '保密'
	END AS '性别'
FROM test_tb;

这里写图片描述


###简单的嵌套使用
通过上面的例子知道case语句中可以返回逻辑上的值,而在函数中我们可以嵌套使用case语句返回的值。举个栗子吧!

数据准备:首先我有了下面这样的一张表。表中的字段包括了id值,用户名,性别,成绩。其中sex字段中1表示男生,0表示女生,其他值表示性别保密。
这里写图片描述

需求:现在又来了个需求,豆豆你给我写个sql统计一下上面表中男生、女生、性别不公开各有多少人。
分析:豆豆心想:嗯简单呀,使用where判断sex的类型,在用count()求总的行数
这里写图片描述

蟹老板:哈哈哈 果然是单纯的孩子,豆在你这样虽然可以得到预期的结果,但是执行了三次sql查询。如果我们想要查询一次就得到应结果,该怎么做呢?
豆豆:表的连接,将子查询join一jion。
蟹老板:是个办法,不过join一般需要用到on的连接条件,不用on的cross join产生的笛卡尔积,我们需要慎用。
豆豆:get到了,那在给点tips 嘻嘻。
蟹老板:试试用case ,你可以的【坏笑】。

豆豆点了杯喜茶,冷静一下。茶喝完,sql也写出了如下:

SELECT 
		SUM(CASE WHEN sex = 1 THEN 1 ELSE 0 END) AS '男生总数',
		SUM(CASE WHEN sex = 0 THEN 1 ELSE 0 END) AS '女生总数',
		SUM(CASE WHEN sex !=1 AND sex !=0  THEN 1 ELSE 0 END) AS '保密总数'
FROM test_tb;

这里写图片描述

###需要注意的点

  1. case得到的结果尽量使用别名显示;
  2. end关键字不能省、不能省、不能省,否则语法解析错误。
  3. else可以省略,如果省略并且when条件中都不满足,则返回null

补充

流程控制还可以使用if函数
if(表达式,表达式为true的值,表达式为false的值)


mysql> SELECT IF(1>2 ,'TRUE','FALSE') result;
+--------+
| result |
+--------+
| FALSE  |
+--------+
1 row in set
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值