SQL基础系列(七)——CASE表达式
在SQL语句中,CASE表达式是非常重要的函数,在区分不同情况时常使用。
本文介绍CASE表达式的基本语句,语句的基本执行逻辑及使用场景。在使用场景中将以实例展示CASE表达式的用法。
目录
1.基本语句
2.语句基本执行逻辑
3.使用场景
3.1根据条件进行分类
3.2分类统计
3.3与GROUP BY的不同
3.4和GROUP BY 组合使用
1.基本语句
CASE WHEN <求值表达式> THEN <表达式>WHEN <求值表达式> THEN <表达式>WHEN <求值表达式> THEN <表达式>WHEN <求值表达式> THEN <表达式>ELSE <表达式>
END
在<求值表达式>中,会采用“列=值”的写法,表达式中也可以使用<>, LIKE,BETWEEN AND,等谓词。
在<求值表达式>中,可以使用AND或者OR写多个条件。
基本语句示例:
CASE WHEN sex='1' THEN '男'WHEN sex='2' THEN '女'ELSE '其他'
END
2.语句基本执行逻辑
对于数据表中的每一条记录,CASE表达式会从第一个WHEN开始执行判断,如果返回结果为真(TRUE),那么就返回THEN中的表达式。CASE表达式的执行结束。
如果第一个WHEN执行结果不为真,那么就继续执行下一个WHEN,直到有一个为真,返回THEN中的表达式。CASE表达式的执行结束。
如果所有的WHEN都不为真,那么返回ELSE表达式的结果。执行结束。
CASE语句在执行时,最终会返回一个值,即使写了几十行WHEN THEN,但是CASE表达式执行一次之后,也只会返回简单的值,比如上个示例中的’女‘、’男‘或者’其他‘。
3.使用场景
预先设定grade表,表中是一个班里学生的数学期末考试成绩:
id | name | score | sex |
001 | 张三 | 70 | 0 |
002 | 李四 | 50 | 0 |
003 | 王武 | 90 | 1 |
3.1根据条件进行分类
题目1:成绩表(grade)中,大于等于60分为及格,小于60分不不及格,查询学生的及格和不及格情况。
SELECTname, score,(CASE WHEN score < 60 THEN '不及格'WHEN score >= 60 THEN '及格'ELSE '异常' END) AS remark
FROMgrade;
语句提示:
在SELECT子句中使用CASE表达式,表中的字段列可以和CASE表达式并存。
一般会给CASE表达式的结果设置别名(AS XXX)
ELSE子句如果不写,会默认为ELSE NULL
注意不要忽略END
返回结果:
name | score | remark |
张三 | 70 | 及格 |
李四 | 50 | 不及格 |
王武 | 90 | 及格 |
3.2分类统计
题目2:统计及格和不及格的人数
SELECT SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END) AS sum_pass,SUM(CASE WHEN score<60 THEN 1 ELSE 0 END) AS sum_fail
FROM grade;
语句解析:
在CASE表达式中,对于成绩及格(大于等于60)的学生,赋值为1,不及格的赋值为0,再利用SUM函数统计,得出的结果即是成绩及格学生数。
同理,对于成绩不及格的学生,赋值为1,对于成绩及格的学生,赋值为0,利用sum函数统计,得出的结果即为成绩不合格的学生数。
返回结果:
sum_pass | sum_fail |
2 | 1 |
题目3:统计男生的数量及男生及格的人数
SELECT SUM(CASE WHEN sex='0' THEN 1 ELSE 0 END) AS sum_male,SUM(CASE WHEN sex='0'AND score>=60 THEN 1 ELSE 0 END) AS sum_pass_male
FROM grade;
语句解析:
利用CASE表达式和SUM函数的结合。
SELECT子句中,设置如果性别为男,那么赋值1,否则赋值0,再进行SUM加和,求出男生的数量;
设置性别为男且分数及格,赋值为1,否则赋值0,再进行SUM加和,求出及格男生的数量。
在WHEN子句中可以跟多个条件,用AND或OR进行连接。
返回结果:
sum_male | sum_pass_male |
2 | 1 |
3.3与GROUP BY的不同
GROUP BY 是根据数据中,已有数据列进行分组,分组后可以进行统计。
CASE表达式可以根据已有数据判断分组(比如根据具体的考试成绩分为及格和不及格两种情况),然后再利用函数进行统计。
3.4和GROUP BY 组合使用
现有成绩表如下:
id | name | score | sex | class |
001 | 张三 | 70 | 0 | 高一班 |
002 | 李四 | 50 | 0 | 高二班 |
003 | 王武 | 90 | 1 | 高三班 |
004 | 张六 | 76 | 1 | 高一班 |
005 | 李七 | 52 | 0 | 高二班 |
006 | 王就 | 99 | 1 | 高一班 |
004 | 汤天 | 64 | 0 | 高三班 |
题目4:统计不同班级中,及格和不及格的人数
SELECT class,SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END) AS sum_pass,SUM(CASE WHEN Score<60 THEN 1 ELSE 0 END) AS sum_fail
FROM grade
GROUP BY class;
语句解析:
题目中需进行两次分组或分类,分别是“班级”和“及格/不及格”。可通过GROUP BY 将不同班级的数据分组,然后对每个班级中“及格/不及格”对人数进行统计。
在GROUP BY 子句中完成班级分组。
在SELECT子句中,及格的被赋值为1,不及格赋值为0,然后SUM函数加和,求出及格人数。同理,不及格赋值为1,及格赋值为0,然后SUM函数加和,求出不及格人数。
注意,由于在GROUP BY 中已经进行班级分组,SELECT语句执行时,是分别对每个班级的数据进行统计。(GROUP BY 的执行顺序先于 SELECT)
执行结果:
class | sum_pass | sum_fail |
高一班 | 3 | 0 |
高二班 | 0 | 2 |
高三班 | 2 | 0 |
由于是在SELECT子句中使用CASE表达式 ,每个CASE表达式的结果独立成列。
SQL基础系列(七)——CASE表达式相关推荐
- SQL基础系列(二)——单表查询
本文以单表查询为边界,介绍如何对一张表进行简单查询.限制条件查询.结果排序等内容.每种情况均有例句和补充说明. 如想看更多示例,请移步<SQL基础教程(第二版)>-MICK(如需电子版,可 ...
- SQL基础系列(一)——基本概念
在几年前学习sql的时候,直接上手开始学习sql语句,但是忽略了sql(structured query language)的本质其实是关系型数据库的语言.在使用这些语言之前,必须对一些基本的概念有大 ...
- ROS基础系列(七):机器人的建模与仿真(中)
第七章建模与仿真分为上.中.下三节. 上节讲解机器人相关建模语言URDF和xacro,并用丰富的案例做实践 中节讲解控制器,重点是ros_control 下节主要介绍gazebo,讲解机器人如何在仿真 ...
- SQL基础系列(四)——多表查询
本部分内容包括如何使用2张以上的表如何进行横向联结(表的联结)及竖向联结(集合运算). 目录 1.表的联结 1.1联结是什么 1.2内联结 1.3外联结 1.4多张表联结 1.5复杂表联结语句 2.其 ...
- SQL基础【七、Order by】
1:对指定列进行升序排列 Select * from user order by user_name 2:按照user_id逆序排列 Select * from user order by user_ ...
- SQL基础系列(五)——子查询
子查询是在一个完整的查询语句中,嵌套不同功能的小查询,从而完成复杂查询的一种编写形式.本部分主要介绍非关联子查询,关联子查询的适用场景,语句写法,执行逻辑及相对应的注意事项. 目录 1.非关联子查询 ...
- 大数据系列sql基础知识(史上最全,收藏起来)
大数据系列文章,从技术能力.业务基础.分析思维三大板块来呈现,你将收获: 1. 提升自信心,自如应对面试,顺利拿到实习岗位或offer: 2.掌握大数据的基础知识,与其他同事沟通无障碍: 3. 具备一 ...
- mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式
SQL 基础知识梳理(六)- 函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为"参数",输出值称 ...
- Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询.本文在上文的基础上,再做更加深入的引申.同时修正上文中一些不妥的地方. 1, object的动态查询续 首先 ...
最新文章
- 【杂谈】如何在言有三本人的随时答疑下, 长期而系统地学习深度学习和计算机视觉,这是有三AI的完整计划...
- 怀念一下过去的人和事
- 如何领导团队做好技术债管理?
- 【阅读笔记】:End-to-end Structure-Aware Convolutional Networks for Knowledge Base Completion
- python 错误类型及解释
- paip.docfile二进制复合文档
- 计算KL散度与JS散度的MATLAB程序
- Linux电脑怎么接投影,linux如何连接投影机
- Tuna Scope 金枪鱼猎手:当顶级吃货,搞起图像识别
- Pycharm下载及安装保姆级教学(Mac)
- CVPR 2022 全面盘点:最新350篇论文分方向汇总 / 代码 /
- 瑞萨电子RZ/G2L开发板上手评测
- spa项目开发首页导航左侧菜单
- java调用浏览器_Java调用浏览器打开网页实例完整版
- 物理隔离与数据交换-网闸的设计原理与误区
- 全面认识MOS管,一篇文章就够了
- 苹果4是android吗,呵呵!原来苹果手机有这么多缺点,你想换安卓吗?
- C++ vector 中sort的一些用法
- 全目标结构化视觉识别,视频大数据分析
- GFS/HDFS/TFS/FastDFS/Ceph/GlusterF