题解 | SQL 入门 26 #计算25岁以上和以下的用户数量#

计算25岁以上和以下的用户数量

http://www.nowcoder.com/practice/30f9f470390a4a8a8dd3b8e1f8c7a9fa

知识

CASE函数

是一种多分支的函数,可以根据条件列表的值返回多个可能的结果表达式中的一个。
可用在任何允许使用表达式的地方,但不能单独作为一个语句执行。
分为:
简单CASE函数
搜索CASE函数

简单 CASE函数

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时,显示 “物联网系”。

SELECT 班号 ,班名,
CASE 系号
WHEN 1 THEN '软件工程系'
WHEN 2 THEN '计算机系'
WHEN 3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表

搜索CASE函数

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来做:

SELECT 班号 ,班名,
CASE
WHEN 系号=1 THEN '软件工程系'
WHEN 系号=2 THEN '计算机系'
WHEN 系号=3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表

例49.查询“M01F011”号课程的考试情况,列出学号、课程号和成绩,同时将百分制成绩显示为等级。

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.统计每个班男生和女生的数量各是多少,统计结果的表头为,班号,男生数量,女生数量。

SELECT 班号,
COUNT(CASE WHEN 性别=‘男’ THEN ‘男’ END) 男生数,
COUNT(CASE WHEN 性别=‘女’ THEN ‘女’ END) 女生数
FROM 学生表 GROUP BY 班号

例51.判断成绩的等级,85-100为“优”,70-84为“良”,60-69为“及格”,60以下为“不及格”,并统计每一等级的人数。

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岁及以上两个年龄段,分别查看这两个年龄段用户数量

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

示例:user_profile

根据示例,你的查询应返回以下结果:

【题解】SQL 入门 文章被收录于专栏

SQL 入门 题解

全部评论
group by 不是比select提前执行吗?那你这个groupby 怎么还可以使用select的子查询呢?
16 回复 分享
发布于 2022-01-10 17:28
end后边加的应该是什么请做必要的说明,另外age_cut是什么,还有COUNT(*)number是对所有的数字加和是吧,但是number能自动识别是数字的关键字吗
3 回复 分享
发布于 2022-01-26 14:36
此处应有一个赞
10 回复 分享
发布于 2021-10-27 15:15
end 后面的age_cut 相当于给整个case语句写个别名 AS age_cut,AS省略了。不然这列数据的字段就是 (case when age>=25 then 25岁及以上' else '25岁以下'end)。 COUNT(*) number 就是分别对 分组 大于等于25,和小于25的人数统计,列字段为 COUNT(*) ,给了别名 number 。最后字段显示为 number
7 回复 分享
发布于 2022-01-26 17:15
例51为什么不用GROUP BY 等级 而是把CASE条件又写了一遍呢?
7 回复 分享
发布于 2022-03-20 17:14
sql的执行顺序不是先执行group by ,然后再执行select吗?怎么能直接按照age_cut进行group by呢? 我用orcale不能重现,得先group by case when
5 回复 分享
发布于 2022-05-19 09:52
mysql 中 group by 之所以能使用 select 后面的别名是因为 mysql 对其进行了扩充,其他数据库不支持
5 回复 分享
发布于 2022-06-16 21:00
使用IF函数也可以得到答案哦
3 回复 分享
发布于 2021-11-29 18:57
sql的执行顺序不是先执行group by ,然后再执行select吗?怎么能直接按照age_cut进行group by呢?大神求解,万分感谢
3 回复 分享
发布于 2022-04-16 10:32
在 SQL 中,SELECT 语句和 GROUP BY 语句是两个不同的语句,它们的执行顺序也是不同的。在 SELECT 语句中使用的别名在 GROUP BY 语句中是不能直接使用的,因为 GROUP BY 是在 SELECT 执行之后才执行的。 但是,大部分 SQL 数据库引擎都支持使用 SELECT 子句中的别名来代替实际的列名。这是因为数据库引擎在执行 SELECT 语句时,首先会解析 SELECT 子句中的列,为每个列赋予一个别名,然后再执行 GROUP BY 语句。在 GROUP BY 语句中,如果使用了 SELECT 子句中的别名,数据库引擎会将该别名转换为实际的列名,以便正确地进行分组和聚合操作。 需要注意的是,不同的数据库引擎对于别名的支持程度和行为可能会有所不同,一些数据库引擎可能不支持使用别名进行分组和聚合操作。此外,在使用别名时应该尽量避免使用含有特殊字符或保留字的别名,以免引起语法错误。
3 回复 分享
发布于 2023-02-28 21:53 美国
为什么我输入age=null会新生成一个null的类型啊
1 回复 分享
发布于 2021-11-03 09:43
看不懂啊...
1 回复 分享
发布于 2022-01-03 21:41
题主省略了二个as SELECT CASE WHEN age<25 or age is null then '25岁以下' WHEN age>=25 then '25岁及以上' end as age_cut, COUNT(*) as number FROM user_profile GROUP BY age_cut;
1 回复 分享
发布于 2022-01-05 20:02
例51,group by 可以直接接'等级'吧,不用这么大串了
1 回复 分享
发布于 2022-07-31 15:52
为什么group by age_cut可以,group by age不行呢?
点赞 回复 分享
发布于 2021-11-04 18:34
OR age IS NULL 这个为什么一定要加上
点赞 回复 分享
发布于 2021-11-29 16:59
SQL里面有>=符号吗?还是得用那个很长的表达式来表示?
点赞 回复 分享
发布于 2021-12-11 12:21
最后的end是干嘛的,我看有的加了有的又没加
点赞 回复 分享
发布于 2022-01-01 21:37
必须给你一个赞,简直不要太用心了
点赞 回复 分享
发布于 2022-01-26 14:20
分组依据里写了case语句或者统计函数里写了case语句,这该怎么理解,这执行顺序是怎样的
点赞 回复 分享
发布于 2022-02-02 20:43

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
817 146 评论
分享
牛客网
牛客企业服务