从 01 开始 从 01 开始
首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 关于本站
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 文章分类
  • 文章标签
  • 文章归档

PeterJXL

首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 关于本站
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 文章分类
  • 文章标签
  • 文章归档
  • 计算机历史

  • 数字电路

  • 计算机组成原理

  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 计算机小知识

  • MySQL

    • 教程概述
    • 数据的存储
    • 数据库的安装
    • 数据库的启停与连接
    • 数据库的管理
    • SQL概述
    • 表的管理
    • seletct基础
    • 运算符
    • 聚合查询
    • 排序
    • 数据的插入
    • 数据的删除
    • 数据的更新
    • 事务
    • 视图
    • 子查询
    • 函数
    • 谓词
    • CASE表达式
      • 什么是 CASE 表达式
      • CASE 表达式的语法
      • CASE 表达式的使用方法
      • CASE 简写
    • 集合运算
    • 联结-join
    • SQL入门小结
    • 更多数据库
    • MySQL的数据类型
    • 命令行的一些用法
    • 用户与权限管理
    • MySQL的权限管理
    • mysqldump
    • mysqladmin
    • Liquibase
    • 表注释与字段注释
    • 编码类型
  • 计算机基础
  • MySQL
2024-01-21
目录

CASE表达式

# 180.CASE表达式

CASE 是 SQL 中数一数二的重要功能,希望大家能够在这里好好学习掌握。

‍

# 什么是 CASE 表达式

CASE ** 表达式** 也是函数的一种,主要是用来判断和运算,在编程中通常称为 (条件)分支 。

case可以理解为当... 就... 。比如:

  • 当下雨时,就大伞
  • 当出太阳,就不打伞
  • 当下冰雹,就不出门
  • .......

‍

SQL 中的CASE 和 编程语言中的 CASE很类似

‍

# CASE 表达式的语法

语法:

CASE WHEN <求值表达式> THEN <表达式>
     WHEN <求值表达式> THEN <表达式>
     WHEN <求值表达式> THEN <表达式>
       .
       .
       .
     ELSE <表达式>
END
1
2
3
4
5
6
7
8

WHEN ** ** 子句 中的“< 求值表达式 >”就是使用谓词编写出来的表达式,例如“列 = 值”,或使用= 、!= LIKE 、BETWEEN 等谓词编写出来的

CASE 表达式会从对最初的 WHEN 子句中的“< 求值表达式 >”进行求值,也就是计算出该表达式的真值是什么,计算出来后:

  • 如果结果为真(TRUE ),那么就返回 THEN ** 子句** 中的表达式,CASE 表达式的执行到此为止。
  • 如果结果不为真,那么就跳转到下一条 WHEN 子句的求值之中。
  • 如果直到最后的 WHEN 子句为止返回结果都不为真,那么就会返回 ELSE 中的表达式,执行终止。

注意:CASE表达式最终会返回一个值,无论写了多少行,最后也是只返回一个值。

‍

# CASE 表达式的使用方法

接下来就开始使用case。来考虑这样一种情况,现在 Product 表中包含衣服、办公用品和厨房用具 3 种商品类型,我们想要在查询出数据后,在商品种类前添加几个字母代号:

A :衣服
B :办公用品
C :厨房用具
1
2
3

因为表中的记录并不包含“A :”或者“B :”这样的字符串,所以需要在 SQL 中进行添加,可以考虑使用字符串拼接符号(concat)。

然后就是怎么根据商品种类,拼接对应的字符“A :”“B :”“C 了,这时就可以使用 CASE 表达式来实现:

SELECT product_name,
       CASE WHEN product_type = '衣服' THEN concat('A: ', product_type)
            WHEN product_type = '办公用品' THEN concat('B: ', product_type)
            WHEN product_type = '厨房用具' THEN concat('C: ', product_type)
            ELSE NULL
       END AS abc_product_type
  FROM Product;

-- 结果:
+--------------+------------------+
| product_name | abc_product_type |
+--------------+------------------+
| T恤          | A: 衣服          |
| 打孔器       | B: 办公用品      |
| 运动T恤      | A: 衣服          |
| 菜刀         | C: 厨房用具      |
| 高压锅       | C: 厨房用具      |
| 叉子         | C: 厨房用具      |
| 擦菜板       | C: 厨房用具      |
| 圆珠笔       | B: 办公用品      |
+--------------+------------------+
8 rows in set (0.00 sec)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

‍

注意:

  • 注意,每个分支返回的数据类型都得是一致的。
  • ELSE 子句指定了应该如何处理不满足 WHEN 子句中的条件的记录。 ELSE NULL 的意思是“如果出现上述情况之外的时候,返回 NULL ”。除了NULL,其他值或者表达式也都可以写在 ELSE 子句之中
  • ELSE 子句也可以省略不写,这时会被默认为 ELSE NULL 。但为了可读性,还是建议写出
  • CASE 表达式最后的“END ”是不能省略的,忘写会发生语法错误

‍

# CASE 简写

语法:

CASE <表达式>
    WHEN <表达式> THEN <表达式>
    WHEN <表达式> THEN <表达式>
    WHEN <表达式> THEN <表达式>
        .
        .
        .
    ELSE <表达式>
END

1
2
3
4
5
6
7
8
9
10

执行顺序说明:

  • 首先会计算CASE 关键字之后的表达式的值
  • 然后从最初的 WHEN 子句开始进行,逐一计算WHEN后面的表达式的值,看是否和第一步的值相同,是则返回 THEN ** 子句** 中的表达式,不是跳转到下一条 WHEN 子句的求值之中

‍

刚刚的SQL也可以简写为:

SELECT product_name,
       CASE product_type
            WHEN '衣服'      THEN concat('A: ', product_type)
            WHEN '办公用品'  THEN concat('B: ', product_type)
            WHEN '厨房用具'  THEN concat('C: ', product_type)
            ELSE NULL
        END AS abc_product_type
  FROM Product;
1
2
3
4
5
6
7
8

这样简化了书写,但如果想要在 WHEN 子句中指定不同列时,就无能为力了,得用之前的写法

上次更新: 2024/1/23 16:20:41
谓词
集合运算

← 谓词 集合运算→

Theme by Vdoing | Copyright © 2022-2024 | 粤 ICP 备 2022067627 号-1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式