CASE函数
是一种多分支的函数,可以根据条件列表的值返回多个可能的结果表达式中的一个。 可用在任何允许使用表达式的地方,但不能单独作为一个语句执行。 分为: 简单CASE函数 搜索CASE函数
简单 CASE函数
1
2
3
4
5
6
CASE
测试表达式
WHEN
简单表达式1
THEN
结果表达式1
WHEN
简单表达式2
THEN
结果表达式2 …
WHEN
简单表达式n
THEN
结果表达式n
[
ELSE
结果表达式n+1 ]
END
计算测试表达式,按从上到下的书写顺序将测试表达式的值与每个WHEN子句的简单表达式进行比较。 如果某个简单表达式的值与测试表达式的值相等,则返回第一个与之匹配的WHEN子句所对应的结果表达式的值。 如果所有简单表达式的值与测试表达式的值都不相等, 若指定了ELSE子句,则返回ELSE子句中指定的结果表达式的值; 若没有指定ELSE子句,则返回NULL。
例48. 查询班级表中的学生的班号、班名、系号和班主任号,并对系号作如下处理: 当系号为1时,显示 “计算机系”; 当系号为2时,显示 “软件工程系”; 当系号为3时,显示 “物联网系”。
1
2
3
4
5
6
7
SELECT
班号 ,班名,
CASE
系号
WHEN
1
THEN
'软件工程系'
WHEN
2
THEN
'计算机系'
WHEN
3
THEN
'物联网系'
END
AS
系号,班主任号
FROM
班级表
搜索CASE函数
1
2
3
4
5
6
CASE
WHEN
布尔表达式1
THEN
结果表达式1
WHEN
布尔表达式2
THEN
结果表达式2 …
WHEN
布尔表达式n
THEN
结果表达式n
[
ELSE
结果表达式n+1 ]
END
按从上到下的书写顺序计算每个WHEN子句的布尔表达式。 返回第一个取值为TRUE的布尔表达式所对应的结果表达式的值。 如果没有取值为TRUE的布尔表达式, 则当指定了ELSE子句时,返回ELSE子句中指定的结果; 如果没有指定ELSE子句,则返回NULL。
例48用搜索CASE来做:
1
2
3
4
5
6
7
SELECT
班号 ,班名,
CASE
WHEN
系号=1
THEN
'软件工程系'
WHEN
系号=2
THEN
'计算机系'
WHEN
系号=3
THEN
'物联网系'
END
AS
系号,班主任号
FROM
班级表
例49.查询“M01F011”号课程的考试情况,列出学号、课程号和成绩,同时将百分制成绩显示为等级。
1
2
3
4
5
6
7
8
9
10
SELECT
学号,课程号,
CASE
WHEN
成绩 >= 90
THEN
'优'
WHEN
成绩
BETWEEN
80
AND
89
THEN
'良'
WHEN
成绩
BETWEEN
70
AND
79
THEN
'中'
WHEN
成绩
BETWEEN
60
AND
69
THEN
'及格'
WHEN
成绩 <60
THEN
'不及格'
END
成绩
FROM
成绩表
WHERE
课程号 =
'M01F011'
CASE函数(续)
例50.统计每个班男生和女生的数量各是多少,统计结果的表头为,班号,男生数量,女生数量。
1
2
3
4
SELECT
班号,
COUNT
(
CASE
WHEN
性别=‘男’
THEN
‘男’
END
) 男生数,
COUNT
(
CASE
WHEN
性别=‘女’
THEN
‘女’
END
) 女生数
FROM
学生表
GROUP
BY
班号
例51.判断成绩的等级,85-100为“优”,70-84为“良”,60-69为“及格”,60以下为“不及格”,并统计每一等级的人数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
CASE
WHEN
GRADE
BETWEEN
85
AND
100
THEN
'优'
WHEN
GRADE
BETWEEN
70
AND
84
THEN
'良'
WHEN
GRADE
BETWEEN
60
AND
69
THEN
'及格'
ELSE
'不及格'
END
等级,
COUNT
(*) 人数
FROM
SC
GROUP
BY
CASE
WHEN
GRADE
BETWEEN
85
AND
100
THEN
'优'
WHEN
GRADE
BETWEEN
70
AND
84
THEN
'良'
WHEN
GRADE
BETWEEN
60
AND
69
THEN
'及格'
ELSE
'不及格'
END
题解
题目:现在运营想要将用户划分为25岁以下和25岁及以上两个年龄段 ,分别查看这两个年龄段用户数量
1
2
3
4
5
SELECT
CASE
WHEN
age < 25
OR
age
IS
NULL
THEN
'25岁以下'
WHEN
age >= 25
THEN
'25岁及以上'
END
age_cut,
COUNT
(*)number
FROM
user_profile
GROUP
BY
age_cut
22222222.
本题考的是条件函数if。if(x=n,a,b)表示如果x=n,则返回a,否则就是b了。
代码:
1
2
3
4
5
Select
if
(age>=25,
'25岁及以上'
,
'25岁以下'
) as age_cut,
count(device_id) as number
From user_profile
Group by age_cut
//牛客网似乎没有对执行顺序做限制。但是很多数据库是不能在group by中 用所在表中不存在的列的。所以要把前面的结果,做成派生表,也就是要套一层壳。
针对这题,更好的答案如下:
复制代码
1
2
3
4
select
age_cut,
count
(device_id)
as
number
from
(
Select
if(age>=25,
'25岁及以上'
,
'25岁以下'
)
as
age_cut,device_id
From
user_profile)u2
Group
by
age_cut