MySQL CASE 表达式

一、CASE表达式的语法

-- 简单CASE表达式
CASE sex
	WHEN 1 THEN '男'
	WHEN 2 THEN '女'
	ELSE '保密'
END

-- 搜索CASE表达式
CASE
	WHEN sex=1 THEN '男'
	WHEN sex=2 THEN '女'
	ELSE '保密'
END 

注意事项:

  1. 各分支返回的数据类型必须一致;
  2. 结尾一定要写 END;
  3. 养成写 ELSE 子句的习惯(否则返回 NULL);

二、 常用场景

1,按属性分组统计

如:已有全国各市区人口数,统计各省总人口数

idcitypopulation
1南昌市656
2九江市454
3宜春市495
4合肥市800
5芜湖市373
6蚌埠市330
7长沙市1005
8株洲市390
9北京市2185
province总人口
江西省1605
安徽省1503
湖南1395
其它2185
SELECT
	CASE 
		WHEN city IN('南昌市','九江市','宜春市') THEN '江西省'
		WHEN city IN('合肥市','芜湖市','蚌埠市') THEN '安徽省'
		WHEN city IN('长沙市','株洲市') THEN '湖南'
		ELSE '其它'
	END AS province, SUM(population) AS '总人口'
FROM `city_pop`
GROUP BY province 

2,多条件统计

如:按姓名和学科汇总成绩

idnameclassscore
1张三chinese98
2张三math87
3张三english91
4李四chinese100
5李四math98
6李四english79
name语文数学英语
张三988791
李四1009879
SELECT name,
	SUM(CASE WHEN class='chinese' THEN score ELSE 0 END) AS '语文',
	SUM(CASE WHEN class='math' THEN score ELSE 0 END) AS '数学',
	SUM(CASE WHEN class='english' THEN score ELSE 0 END) AS '英语'
FROM `class`
GROUP BY name

3,按条件UPDATE

如:工资20000以上员工降薪10%;工资10000以下员工加薪20%

idnamesalary
1张三25000
2李四9000
3王五12000
idnamesalary
1张三22500
2李四10800
3王五12000
UPDATE salary 
SET salary =
	CASE 
		WHEN salary >= 20000 THEN  salary - salary*0.1 
	  	WHEN salary <= 10000 THEN  salary + salary*0.2 
		ELSE salary 
	END

4, 在CASE表达式中使用聚合函数

如:每个人可以参加一个或多个俱乐部,当某人参加多个俱乐部时,需要用flag=1设置主俱乐部,默认flag=0

idnameclubflag
1张三篮球0
2张三羽毛球1
3李四足球0
4李四篮球1
5王五足球0
6刘六羽毛球0
namemain_club
张三羽毛球
李四篮球
王五足球
刘六羽毛球
// group by 为严格模式(sql_mod=ONLY_FULL_GROUP_BY)时,
// select查询的列,要么在group by中声明,要么通过聚合函数包装(此处用了max)
SELECT name, 
	CASE 
		WHEN COUNT(*) > 1 THEN  
			MAX(CASE WHEN flag = 1 THEN club ELSE NULL END)
		ELSE MAX(club) 
	END AS main_club
FROM club
GROUP BY name

三、CASE表达式出现的位置

作为表达式,在执行时会被判断为一个固定值,因此不仅可以在SELECT子句中使用,还可以在WHERE子句、GROUP BY 子句、ORDER BY 子句中使用,它甚至可以写在聚合函数内部。
简单点来说,在能写列名和常量的地方,通常都可以写CASE表达式

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值