1-1 CASE表达式

将已有编号方式转换为新的方式并统计

SELECT CASE pref_name
		WHEN '德岛' THEN '四国'
		WHEN '香川' THEN '四国'
		WHEN '爱媛' THEN '四国'
		WHEN '高知' THEN '四国'
		WHEN '福冈' THEN '九州'
		WHEN '佐贺' THEN '九州'
		WHEN '长崎' THEN '九州'
		ELSE '其他'
	END AS district, SUM(population)
FROM PopTbl
GROUP BY CASE pref_name
		WHEN '德岛' THEN '四国'
		WHEN '香川' THEN '四国'
		WHEN '爱媛' THEN '四国'
		WHEN '高知' THEN '四国'
		WHEN '福冈' THEN '九州'
		WHEN '佐贺' THEN '九州'
		WHEN '长崎' THEN '九州'
		ELSE '其他'
	END;

case表达式给结果集添加了数据表中没有的信息, 如: 四国 / 九州 / 其他

用一条 SQL 语句进行不同条件的统计

分组聚合时,通过一定的限制条件,形成我们需要的交叉表

交叉表(CrossTabulations)是一种常用的分类汇总表格。利用交叉表查询数据非常直观明了,被广泛应用。交叉表查询也是数据库的一个特点。

SELECT pref_name, 
	SUM(CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m, 
	SUM(CASE WHEN sex = '2' THEN population ELSE 0 END) AS cnt_f
FROM PopTbl2
GROUP BY pref_name;

在 UPDATE 语句里进行条件分支

UPDATE Salaries
SET salary = CASE 
	WHEN salary >= 300000 THEN salary * 0.9
	WHEN salary >= 250000 AND salary < 280000 THEN salary * 1.2
	ELSE salary
END;

SQL 语句最后一行的 ELSE salary 非常重要,必须写上。因为如果没有它,条件 1 和条件 2 都不满足的员工的工资就会被更新成 NULL 。这一点与 CASE 表达式的设计有关,如果 CASE 表达式里没有明确指定 ELSE 子句,执行结果会被默认地处理成 ELSE NULL 。

表之间的数据匹配

在 CASE 表达式里,我们可以使用 BETWEEN 、LIKE和 < 、> 等便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。
在这里插入图片描述在这里插入图片描述case中使用子查询

-- 表的匹配:使用IN 谓词
SELECT course_name,
CASE WHEN course_id IN 
(SELECT course_id FROM OpenCourses WHERE month = 200706) THEN '○'
ELSE '×' END AS "6 月",
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses WHERE month = 200707) THEN '○'
ELSE '×' END AS "7 月",
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses WHERE month = 200708) THEN '○'
ELSE '×' END AS "8 月"
FROM CourseMaster;

-- 表的匹配:使用EXISTS 谓词, EXISTS常配合关联子查询, 性能更好
SELECT CM.course_name,
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC WHERE month = 200706
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "6 月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC WHERE month = 200707
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "7 月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC WHERE month = 200708
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "8 月"
FROM CourseMaster CM;

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

在这里插入图片描述
我们按照下面的条件查询这张表里的数据:

  1. 获取只加入了一个社团的学生的社团 ID。
  2. 获取加入了多个社团的学生的主社团 ID。
SELECT std_id
	, CASE 
		WHEN COUNT(*) = 1 THEN MAX(club_id)
		ELSE MAX(CASE 
			WHEN main_club_flg = 'Y' THEN club_id
			ELSE NULL
		END)
	END AS main_club
FROM StudentClub
GROUP BY std_id;

本节要点

  1. 新手用 WHERE 子句进行条件分支,高手用 SELECT 子句进行条件分支。
  2. 新手用 HAVING 子句进行条件分支,高手用 SELECT 子句进行条件分支
  3. CASE 表达式在执行时会被判定为一个固定值,因此它可以写在聚合函数内部;也正因为它是表达式,所以还可以写在SELECE 子句、GROUP BY 子句、WHERE 子句、ORDER BY 子句里。简单点说,在能写列名和常量的地方,通常都可以写 CASE 表达式。
  4. 相比依赖于具体数据库的函数,CASE 表达式有更强大的表达能力和更好的可移植性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值