MySQL中的case表达式

case 表达式 & case 语句

假如我们有一张表名为 employees ,如下所示:

复制代码
+-------------+------------+-----------+---------------+---------+------------+--------+
| employee_id | first_name | last_name | department_id | salary  | hire_date  | gender |
+-------------+------------+-----------+---------------+---------+------------+--------+
|           1 | John       | Doe       |             1 | 4500.00 | 2020-01-15 | M      |
|           2 | Jane       | Smith     |             2 | 5500.00 | 2019-03-22 | F      |
|           3 | Robert     | Brown     |             1 | 3500.00 | 2018-07-11 | M      |
|           4 | Emily      | Davis     |             3 | 2500.00 | 2021-05-17 | F      |
|           5 | Michael    | Wilson    |             2 | 7000.00 | 2017-11-05 | M      |
|           6 | Linda      | Taylor    |             3 | 4200.00 | 2020-10-25 | F      |
|           7 | David      | Anderson  |             1 | 4800.00 | 2019-08-19 | M      |
|           8 | Sarah      | Thomas    |             2 | 5100.00 | 2018-12-13 | F      |
|           9 | James      | Jackson   |             3 | 3100.00 | 2016-09-03 | M      |
|          10 | Patricia   | White     |             1 | 6000.00 | 2015-02-22 | F      |
+-------------+------------+-----------+---------------+---------+------------+--------+

case 表达式

CASE 表达式是用于在 SELECT 或其他查询语句中根据条件产生不同结果的方法。case 表达式有简单 case 表达式和搜索 case 表达式。(了解即可,实际上输出的结果是相同的)

基于员工的薪水(salary)字段返回不同的级别:

sql 复制代码
-- 搜索 case 表达式
SELECT first_name, last_name,
    CASE
        WHEN salary < 3000 THEN 'Low'
        WHEN salary >= 3000 AND salary < 5000 THEN 'Medium'
        WHEN salary >= 5000 THEN 'High'
        ELSE 'Unknown'
    END AS salary_level
FROM employees;

+------------+-----------+--------------+
| first_name | last_name | salary_level |
+------------+-----------+--------------+
| John       | Doe       | Medium       |
| Jane       | Smith     | High         |
| Robert     | Brown     | Medium       |
| Emily      | Davis     | Low          |
| Michael    | Wilson    | High         |
| Linda      | Taylor    | Medium       |
| David      | Anderson  | Medium       |
| Sarah      | Thomas    | High         |
| James      | Jackson   | Medium       |
| Patricia   | White     | High         |
+------------+-----------+--------------+
sql 复制代码
-- 简单 case 表达式
SELECT 
    first_name,
    last_name,
    CASE department_id
        WHEN 1 THEN 'HR'
        WHEN 2 THEN 'Engineering'
        WHEN 3 THEN 'Sales'
        ELSE 'Unknown'
    END AS department_name
FROM employees;

+------------+-----------+-----------------+
| first_name | last_name | department_name |
+------------+-----------+-----------------+
| John       | Doe       | HR              |
| Jane       | Smith     | Engineering     |
| Robert     | Brown     | HR              |
| Emily      | Davis     | Sales           |
| Michael    | Wilson    | Engineering     |
| Linda      | Taylor    | Sales           |
| David      | Anderson  | HR              |
| Sarah      | Thomas    | Engineering     |
| James      | Jackson   | Sales           |
| Patricia   | White     | HR              |
+------------+-----------+-----------------+
10 rows in set (0.00 sec)

注意点:

  1. else 子句可以不用写,但是不建议。养成良好的习惯。
  2. end 是必不可少的。

case 语句

CASE 语句是一种更通用的形式,可以在 SQL 中的任何位置使用,例如 SELECTUPDATEDELETE 语句中。

  • 与聚合函数结合使用。

统计每个部门的男性和女性员工数量

sql 复制代码
SELECT 
    department_id,
    SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count,
    SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count
FROM employees
GROUP BY department_id;


+---------------+------------+--------------+
| department_id | male_count | female_count |
+---------------+------------+--------------+
|             1 |          3 |            1 |
|             2 |          1 |            2 |
|             3 |          1 |            2 |
+---------------+------------+--------------+
3 rows in set (0.01 sec)

case 语句不仅能写在聚合函数里面,还能写在聚合函数外面。

统计大部门和小部门

sql 复制代码
SELECT department_id,
       CASE 
           WHEN COUNT(*) > 3 THEN 'big'
           ELSE 'small'
       END AS scale
FROM employees
GROUP BY department_id;

+---------------+-------+
| department_id | scale |
+---------------+-------+
|             1 | big   |
|             2 | small |
|             3 | small |
+---------------+-------+
3 rows in set (0.00 sec)
  • 在 UPDATE 语句里进行条件分支

假如让工资大于等于 5000 的降薪 20%,小于 5000 的涨薪 20%。你会怎么做?

首先最先想到的应该是两个UPDATE进行更新。但是有没有想过执行完第一个条件后,会对第二个进行干扰,从而出现错误的结果。

下面来看一个简单的方式来完成这个要求:

sql 复制代码
UPDATE employees
SET salary = 
    CASE
        WHEN salary >= 5000 THEN salary * 0.8  
        WHEN salary < 5000 THEN salary * 1.2 
    END;
    
-- 查询后的结果
+-------------+------------+-----------+---------------+---------+------------+--------+
| employee_id | first_name | last_name | department_id | salary  | hire_date  | gender |
+-------------+------------+-----------+---------------+---------+------------+--------+
|           1 | John       | Doe       |             1 | 5400.00 | 2020-01-15 | M      |
|           2 | Jane       | Smith     |             2 | 4400.00 | 2019-03-22 | F      |
|           3 | Robert     | Brown     |             1 | 4200.00 | 2018-07-11 | M      |
|           4 | Emily      | Davis     |             3 | 3000.00 | 2021-05-17 | F      |
|           5 | Michael    | Wilson    |             2 | 5600.00 | 2017-11-05 | M      |
|           6 | Linda      | Taylor    |             3 | 5040.00 | 2020-10-25 | F      |
|           7 | David      | Anderson  |             1 | 5760.00 | 2019-08-19 | M      |
|           8 | Sarah      | Thomas    |             2 | 4080.00 | 2018-12-13 | F      |
|           9 | James      | Jackson   |             3 | 3720.00 | 2016-09-03 | M      |
|          10 | Patricia   | White     |             1 | 4800.00 | 2015-02-22 | F      |
+-------------+------------+-----------+---------------+---------+------------+--------+
10 rows in set (0.00 sec)

这样看来就是很合理了。

case的用法不仅仅有这些,在case表达式里,我们可以使用BETWEEN,LIKE等等便利的谓词,以及能嵌套子查询的INEXISTS

相关推荐
1.14(java)42 分钟前
SQL数据库操作:从CRUD到高级查询
数据库
Full Stack Developme2 小时前
数据库索引的原理及类型和应用场景
数据库
IDC02_FEIYA3 小时前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录3 小时前
MySQL面试题——联合索引
数据库·面试
萧曵 丶4 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
小北方城市网4 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
毕设十刻4 小时前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
TDengine (老段)6 小时前
TDengine Python 连接器入门指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据
萧曵 丶6 小时前
事务ACID特性详解
数据库·事务·acid
kejiayuan7 小时前
CTE更易懂的SQL风格
数据库·sql