MySQL 条件表达式学习笔记(CASE & IF)

1925字

MySQL 条件表达式学习笔记(CASE & IF)

一、CASE 表达式

1. 基础语法

1
2
3
4
5
6
CASE
    WHEN condition1 THEN result1  -- 当满足条件1时返回结果1
    WHEN condition2 THEN result2  -- 当满足条件2时返回结果2
    ...
    ELSE default_result           -- 默认返回值(可选)
END

2. 典型应用场景

(1) 状态码转文字描述(数据可视化)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT 
    order_id,
    -- 将数字状态码转换为可读文本
    CASE status
        WHEN 1 THEN '未支付'    -- 状态码1对应未支付
        WHEN 2 THEN '已支付'    -- 状态码2对应已支付
        WHEN 3 THEN '已取消'    -- 状态码3对应已取消
        ELSE '未知状态'         -- 兜底处理异常数据
    END AS status_text
FROM orders;

(2) 数据分组统计(报表分析)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT 
    -- 按年龄区间分组
    CASE 
        WHEN age < 18 THEN '未成年'             -- 18岁以下分组
        WHEN age BETWEEN 18 AND 35 THEN '青年'  -- 18-35岁分组
        WHEN age > 35 THEN '中年及以上'        -- 35岁以上分组
        ELSE '未填写年龄'                      -- 处理NULL值
    END AS age_group,
    COUNT(*) AS user_count  -- 统计每组的用户数
FROM users
GROUP BY age_group;         -- 按分组字段聚合

(3) 多条件商品分类(业务规则实现)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT 
    product_id,
    price,
    -- 根据价格、库存等条件动态分类商品
    CASE 
        WHEN price > 1000 THEN '高价商品'               -- 单价>1000归为高价
        WHEN price > 500 AND stock < 10 THEN '需补货商品' -- 同时满足两个条件
        WHEN discount_rate > 0.3 THEN '促销商品'        -- 折扣率>30%算促销
        ELSE '普通商品'                               -- 默认分类
    END AS product_category
FROM products;

二、IF 函数

1. 基础语法

1
2
-- 三目运算符形式:condition ? true_value : false_value
IF(condition, true_value, false_value)

2. 典型应用场景

(1) 用户类型标记(二元判断)

1
2
3
4
5
SELECT 
    username,
    -- 根据is_vip字段返回不同类型文本
    IF(is_vip = 1, 'VIP用户', '普通用户') AS user_type
FROM users;

(2) 空值处理(数据清洗)

1
2
3
4
5
SELECT 
    order_id,
    -- 如果address为NULL则显示默认提示
    IF(address IS NULL, '未填写地址', address) AS shipping_address
FROM orders;

(3) 库存状态预警(业务监控)

1
2
3
4
5
6
7
8
SELECT 
    product_id,
    -- 库存≤5时标记为紧张状态
    IF(stock <= 5, '库存紧张', '库存充足') AS stock_status,
    -- 嵌套IF示例:多级库存预警
    IF(stock = 0, '已售罄', 
       IF(stock <= 3, '紧急补货', '正常库存')) AS stock_level
FROM products;

三、对比总结表

特性 CASE IF
条件分支 支持多分支(WHEN…THEN) 仅支持真 / 假两个分支
可读性 复杂逻辑更清晰 简单判断更简洁
返回值类型 所有分支必须类型一致 真假值类型需兼容
典型场景 多状态映射、复杂业务规则 二元判断、NULL 值处理
性能 多分支时解析稍慢 简单判断效率更高

四、高级用法示例

1. 动态更新数据(批量业务处理)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
UPDATE products
SET price = CASE 
    -- 电子产品类打8折
    WHEN category_id = 3 THEN price * 0.8  
    -- 高库存商品打9折
    WHEN stock > 100 THEN price * 0.9     
    -- 其他商品保持原价
    ELSE price                             
END
WHERE is_on_sale = 1;  -- 只处理促销商品

2. 自定义排序(业务优先级)

1
2
3
4
5
6
7
8
9
SELECT * FROM tasks
ORDER BY 
    -- 按任务优先级自定义排序权重
    CASE priority
        WHEN 'High' THEN 1     -- 高优先级排最前
        WHEN 'Medium' THEN 2   -- 中优先级
        WHEN 'Low' THEN 3      -- 低优先级排最后
        ELSE 4                 -- 无优先级标识的排最后
    END ASC;

3. 嵌套混合使用(复杂业务逻辑)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
SELECT 
    user_id,
    -- 先判断是否及格,再细分优良等级
    IF(score >= 60, 
        CASE 
            WHEN score >= 90 THEN '优秀'     -- ≥90为优秀
            WHEN score >= 80 THEN '良好'     -- 80-89为良好
            ELSE '及格'                     -- 60-79为及格
        END,
        '不及格'                           -- <60为不及格
    ) AS evaluation
FROM exam_results;

五、注意事项

类型安全

1
2
3
4
5
-- 错误示例:混合返回文本和数字
CASE 
    WHEN score > 90 THEN '优秀'
    WHEN score > 60 THEN 1  -- 会导致类型错误
END

NULL 处理

1
2
3
4
5
-- 显式处理NULL情况
CASE 
    WHEN field IS NULL THEN '空值'
    WHEN field = 0 THEN '零值'
END

性能优化

1
2
3
4
5
-- 把高概率条件放在前面
CASE 
    WHEN status = 'paid' THEN 1  -- 已支付状态最常见
    WHEN status = 'unpaid' THEN 2
END

索引失效

1
2
3
-- 避免在WHERE中对索引字段使用函数
SELECT * FROM users 
WHERE IF(age>18,1,0) = 1  -- 导致age索引失效

六、实战练习

场景:电商订单分析报表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT 
    order_id,
    -- 金额分级
    CASE 
        WHEN amount < 50 THEN '小额订单(<50)'
        WHEN amount BETWEEN 50 AND 200 THEN '中额订单(50-200)'
        ELSE '大额订单(>200)'
    END AS order_level,
    
    -- 支付方式处理
    IF(payment_method IN (1,2,3), 
       '在线支付', 
       '其他支付'
    ) AS payment_type,
    
    -- 物流状态
    CASE 
        WHEN shipping_status = 0 THEN '待发货'
        WHEN shipping_status = 1 AND receive_time IS NULL THEN '运输中'
        WHEN receive_time IS NOT NULL THEN '已签收'
        ELSE '状态异常'
    END AS logistics_status
FROM orders
WHERE create_time > '2023-01-01';

通过注释和实际场景示例,可以更清晰地理解 CASE 和 IF 在复杂业务逻辑处理中的应用技巧。建议在数据库管理工具中实际执行这些示例,观察输出结果加深理解。

如对内容有异议,请联系关邮箱2285786274@qq.com修改