【MySQL】探索 MySQL 中的 CASE WHEN 表达式


缘分让我们相遇乱世以外

命运却要我们危难中相爱

也许未来遥远在光年之外

我愿守候未知里为你等待

我没想到为了你我能疯狂到

山崩海啸没有你根本不想逃

我的大脑为了你已经疯狂到

脉搏心跳没有你根本不重要

🎵 邓紫棋《光年之外》


在数据库查询中,复杂的逻辑和条件处理是不可避免的。MySQL 提供了强大的 CASE WHEN 表达式,帮助我们在 SQL 查询中实现条件逻辑。CASE WHEN 表达式类似于编程语言中的 if-else 语句,允许我们根据不同条件返回不同的值。

什么是 CASE WHEN?

CASE WHEN 表达式用于实现条件分支逻辑,可以在 SELECT、UPDATE、DELETE 等语句中使用。其基本语法如下:

sql 复制代码
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
END

其中,condition 是条件表达式,result 是条件满足时返回的结果。如果没有任何条件满足,则返回 ELSE 子句中的结果。如果省略了 ELSE 子句且没有任何条件满足,CASE WHEN 表达式将返回 NULL。

基本用法示例

让我们从一个简单的示例开始。假设我们有一个 students 表,包含学生的姓名和成绩。我们希望根据成绩给学生评级:85 分及以上为 '优秀',70 到 84 分为 '良好',60 到 69 分为 '及格',60 分以下为 '不及格'。

创建示例表并插入数据

sql 复制代码
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    score INT
);

INSERT INTO students (name, score) VALUES
('Alice', 92),
('Bob', 75),
('Charlie', 60),
('David', 58),
('Eva', 83);

使用 CASE WHEN 实现评分

sql 复制代码
SELECT
    name,
    score,
    CASE
        WHEN score >= 85 THEN '优秀'
        WHEN score >= 70 THEN '良好'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS rating
FROM
    students;

查询结果:

diff 复制代码
+---------+-------+----------+
| name    | score | rating   |
+---------+-------+----------+
| Alice   |    92 | 优秀     |
| Bob     |    75 | 良好     |
| Charlie |    60 | 及格     |
| David   |    58 | 不及格   |
| Eva     |    83 | 良好     |
+---------+-------+----------+

进阶用法:嵌套 CASE WHEN 和复杂条件

我们还可以在 CASE WHEN 表达式中使用复杂的条件和嵌套 CASE WHEN。假设我们在 students 表中新增了一个 attendance 列,表示学生的出勤率。我们希望在评级的基础上,根据出勤率进一步细分评级。

添加出勤率数据

sql 复制代码
ALTER TABLE students ADD COLUMN attendance DECIMAL(5, 2);

UPDATE students SET attendance = 95.0 WHERE name = 'Alice';
UPDATE students SET attendance = 85.0 WHERE name = 'Bob';
UPDATE students SET attendance = 90.0 WHERE name = 'Charlie';
UPDATE students SET attendance = 60.0 WHERE name = 'David';
UPDATE students SET attendance = 70.0 WHERE name = 'Eva';

使用嵌套 CASE WHEN 和复杂条件

sql 复制代码
SELECT
    name,
    score,
    attendance,
    CASE
        WHEN score >= 85 THEN
            CASE
                WHEN attendance >= 90 THEN '优秀 - 高出勤'
                ELSE '优秀 - 低出勤'
            END
        WHEN score >= 70 THEN
            CASE
                WHEN attendance >= 80 THEN '良好 - 高出勤'
                ELSE '良好 - 低出勤'
            END
        WHEN score >= 60 THEN
            CASE
                WHEN attendance >= 70 THEN '及格 - 高出勤'
                ELSE '及格 - 低出勤'
            END
        ELSE
            CASE
                WHEN attendance >= 60 THEN '不及格 - 高出勤'
                ELSE '不及格 - 低出勤'
            END
    END AS detailed_rating
FROM
    students;

查询结果:

diff 复制代码
+---------+-------+-------------+-----------------+
| name    | score | attendance  | detailed_rating |
+---------+-------+-------------+-----------------+
| Alice   |    92 |        95.0 | 优秀 - 高出勤   |
| Bob     |    75 |        85.0 | 良好 - 高出勤   |
| Charlie |    60 |        90.0 | 及格 - 高出勤   |
| David   |    58 |        60.0 | 不及格 - 高出勤 |
| Eva     |    83 |        70.0 | 良好 - 低出勤   |
+---------+-------+-------------+-----------------+

使用 CASE WHEN 进行 UPDATE 操作

CASE WHEN 表达式不仅可以在 SELECT 语句中使用,还可以在 UPDATE 语句中使用。假设我们希望根据成绩和出勤率更新学生的评级信息。

添加评级列并更新数据

sql 复制代码
ALTER TABLE students ADD COLUMN rating VARCHAR(50);

UPDATE students
SET rating = CASE
    WHEN score >= 85 THEN
        CASE
            WHEN attendance >= 90 THEN '优秀 - 高出勤'
            ELSE '优秀 - 低出勤'
        END
    WHEN score >= 70 THEN
        CASE
            WHEN attendance >= 80 THEN '良好 - 高出勤'
            ELSE '良好 - 低出勤'
        END
    WHEN score >= 60 THEN
        CASE
            WHEN attendance >= 70 THEN '及格 - 高出勤'
            ELSE '及格 - 低出勤'
        END
    ELSE
        CASE
            WHEN attendance >= 60 THEN '不及格 - 高出勤'
            ELSE '不及格 - 低出勤'
        END
END;

验证更新结果

sql 复制代码
SELECT * FROM students;

查询结果:

diff 复制代码
+----+---------+-------+-------------+-----------------+
| id | name    | score | attendance  | rating          |
+----+---------+-------+-------------+-----------------+
|  1 | Alice   |    92 |        95.0 | 优秀 - 高出勤   |
|  2 | Bob     |    75 |        85.0 | 良好 - 高出勤   |
|  3 | Charlie |    60 |        90.0 | 及格 - 高出勤   |
|  4 | David   |    58 |        60.0 | 不及格 - 高出勤 |
|  5 | Eva     |    83 |        70.0 | 良好 - 低出勤   |
+----+---------+-------+-------------+-----------------+

总结

CASE WHEN 表达式是 MySQL 中一个非常强大的工具,能够帮助我们在 SQL 查询中实现复杂的条件逻辑。通过掌握 CASE WHEN 的使用,你可以在数据查询和更新中实现更为灵活和精细的控制。

在实际应用中,根据具体需求,灵活运用 CASE WHEN 表达式,可以极大地提高 SQL 查询的效率和可读性。希望这篇文章能够帮助你更好地理解和使用 MySQL 中的 CASE WHEN 表达式。

相关推荐
SamDeepThinking8 分钟前
MySQL InnoDB Redo Log简单介绍
mysql
GOATLong14 分钟前
MySQL内置函数
android·数据库·c++·vscode·mysql
bcgbsh14 分钟前
数据库分类详解
数据库
立志成为大牛的小牛40 分钟前
数据结构——二十九、图的广度优先遍历(BFS)(王道408)
数据结构·数据库·学习·程序人生·考研·算法·宽度优先
爬山算法44 分钟前
Redis(78) 如何设置Redis的缓存失效策略?
数据库·redis·缓存
DemonAvenger2 小时前
深入Redis String:从基础到实战,10年经验的后端工程师带你解锁最佳实践
数据库·redis·性能优化
shuair2 小时前
redis大key问题
数据库·redis·缓存
SelectDB2 小时前
Apache Doris 4.0 版本正式发布:全面升级 AI 与搜索能力,强化离线计算
数据库·数据分析·apache
SelectDB2 小时前
从 Snowflake 到 Apache Doris:Planet 实时分析成本直降 80%、查询加速 90 倍
数据库·数据分析·apache
TDengine (老段)2 小时前
TDengine 数学函数 LOG 用户手册
java·大数据·数据库·时序数据库·iot·tdengine·涛思数据