在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

题目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

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表达式相关推荐

  1. SQL基础系列(二)——单表查询

    本文以单表查询为边界,介绍如何对一张表进行简单查询.限制条件查询.结果排序等内容.每种情况均有例句和补充说明. 如想看更多示例,请移步<SQL基础教程(第二版)>-MICK(如需电子版,可 ...

  2. SQL基础系列(一)——基本概念

    在几年前学习sql的时候,直接上手开始学习sql语句,但是忽略了sql(structured query language)的本质其实是关系型数据库的语言.在使用这些语言之前,必须对一些基本的概念有大 ...

  3. ROS基础系列(七):机器人的建模与仿真(中)

    第七章建模与仿真分为上.中.下三节. 上节讲解机器人相关建模语言URDF和xacro,并用丰富的案例做实践 中节讲解控制器,重点是ros_control 下节主要介绍gazebo,讲解机器人如何在仿真 ...

  4. SQL基础系列(四)——多表查询

    本部分内容包括如何使用2张以上的表如何进行横向联结(表的联结)及竖向联结(集合运算). 目录 1.表的联结 1.1联结是什么 1.2内联结 1.3外联结 1.4多张表联结 1.5复杂表联结语句 2.其 ...

  5. SQL基础【七、Order by】

    1:对指定列进行升序排列 Select * from user order by user_name 2:按照user_id逆序排列 Select * from user order by user_ ...

  6. SQL基础系列(五)——子查询

    子查询是在一个完整的查询语句中,嵌套不同功能的小查询,从而完成复杂查询的一种编写形式.本部分主要介绍非关联子查询,关联子查询的适用场景,语句写法,执行逻辑及相对应的注意事项. 目录 1.非关联子查询 ...

  7. 大数据系列sql基础知识(史上最全,收藏起来)

    大数据系列文章,从技术能力.业务基础.分析思维三大板块来呈现,你将收获: 1. 提升自信心,自如应对面试,顺利拿到实习岗位或offer: 2.掌握大数据的基础知识,与其他同事沟通无障碍: 3. 具备一 ...

  8. mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

    SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为"参数",输出值称 ...

  9. Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别

    在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询.本文在上文的基础上,再做更加深入的引申.同时修正上文中一些不妥的地方. 1, object的动态查询续 首先 ...

最新文章

  1. jmeter csv参数化_运用Jmeter参数化来实现接口自动化测试
  2. Android ProGuard使用要点!
  3. CCPC Training Class
  4. 如何化身BAT面试收割机?不吃透都对不起自己
  5. idea中git如何切换到master_IDEA中Git的使用
  6. 简 易 版 线 程 池 模 型 学 习
  7. 硬件反垃圾邮件网关|反垃圾邮件软件产品|反垃圾邮箱邮件系统
  8. JavaScript 概述
  9. RocketMq单机和集群搭建教程
  10. SQL注入-布尔盲注
  11. java json处理入门
  12. 中空格的asc码表_Excel怎么快速提取混合单元格中的中文、英文、数字?
  13. Node-red初级入门
  14. string容器模拟实现及使用——C++
  15. 为什么全网通手机联通显示无服务器,手机卡无服务怎么回事
  16. python 偏态分布调整_如何处理偏态数据
  17. 同步十进制加法计数器设计
  18. DNS工作原理及其过程
  19. 简述网桥的特点_网桥的工作原理和特点是什么?
  20. SVN服务器迁移方法(Windows环境)

热门文章

  1. android 按钮带图标 阴影_Android Material Design系列之FloatingActionButton和Snackbar
  2. D. Serval and Rooted Tree(思维+树形dp+二分辅助)
  3. Velodyne VLP16激光雷达的使用(非常详细)
  4. [机器学习] 衡量线性回归效果的评价指标: R-squared 和调整R方
  5. 如何正确理解商业智能BI的实时性?
  6. Android版数据结构与算法汇总十二章
  7. Django连接MySQL8.0报错django.db.utils.OperationalError: (1045, “Access denied for user ‘16066‘@‘localhos
  8. Linux系统 (二)- 指令学习2
  9. 【delphi】开发微信小程序后台控件(一)(含源代码、演示程序、控件使用帮助)
  10. 定制婚礼小程序开发功能