第8篇:《CASE WHEN 是 SQL 的"如果说"——教你把数据分类打标签》

🎬 开场白:数据也得贴标签,才好讲人话

日常生活中我们经常会说:

  • "这个房租太高了!"
  • "这房子属于中等价位。"
  • "太便宜了,有猫腻。"

这些评价,其实就是对数据打标签。

在 SQL 里,我们用一个非常强大的工具来实现这种逻辑判断:
CASE WHEN:SQL 里的"如果说......否则......"


1️⃣ 什么是 CASE WHEN?

它是 SQL 里的"判断语句"。
语法结构

sql 复制代码
CASE
  WHEN 条件1 THEN 结果1
  WHEN 条件2 THEN 结果2
  ELSE 默认结果
END

它可以出现在 SELECT 里作为"字段",也能出现在 ORDER BY、WHERE 等位置。


2️⃣ 示例表:houses 房源表

house_id title price district
1 精装一房 1800 天河
2 电梯两房 2500 越秀
3 合租三房 2000 天河
4 豪华复式 3600 海珠
5 简装单间 1500 越秀

3️⃣ 用 CASE WHEN 给房子分类

✅ 按价格分档(低/中/高):

sql 复制代码
SELECT title, price,
  CASE
    WHEN price < 1800 THEN '便宜'
    WHEN price BETWEEN 1800 AND 2500 THEN '中等'
    ELSE '昂贵'
  END AS 价格档位
FROM houses;

结果

title price 价格档位
精装一房 1800 中等
电梯两房 2500 中等
合租三房 2000 中等
豪华复式 3600 昂贵
简装单间 1500 便宜

4️⃣ 用 CASE WHEN 做复杂字段的展示

✅ 显示"推荐语"字段(根据价格+区域)

sql 复制代码
SELECT title, price, district,
  CASE
    WHEN price > 3000 THEN '高端精选'
    WHEN district = '天河' THEN '位置优越'
    ELSE '性价比之选'
  END AS 推荐语
FROM houses;

5️⃣ 和聚合函数搭配使用

✅ 看各区平均租金,是否高于全市平均

sql 复制代码
SELECT district, AVG(price) AS avg_price,
  CASE
    WHEN AVG(price) > (
      SELECT AVG(price) FROM houses
    ) THEN '高于平均'
    ELSE '低于平均'
  END AS 对比情况
FROM houses
GROUP BY district;

📌 注意:在 GROUP BY 语句中使用 CASE 时,要结合聚合函数一起判断。


🧠 CASE WHEN 口诀

sql 复制代码
CASE WHEN 是判断王,
语法像 if 来帮忙。
一层一层设条件,
分类打标最在行。

组合逻辑搭聚合,
动态字段都能扛。

🛠 小练习题

1. 按价格将房子分为"低、中、高"

sql 复制代码
SELECT title, price,
  CASE
    WHEN price < 2000 THEN '低'
    WHEN price <= 3000 THEN '中'
    ELSE '高'
  END AS 价位
FROM houses;

2. 给每套房生成一句"推荐语"

sql 复制代码
SELECT title, district, price,
  CASE
    WHEN district = '天河' AND price <= 2000 THEN '通勤之选'
    WHEN district = '海珠' THEN '生活便利'
    ELSE '适合预算党'
  END AS 推荐标签
FROM houses;
相关推荐
J_bean7 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean7 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
冰暮流星13 小时前
mysql之分组查询
数据库·mysql
NiceCloud喜云14 小时前
腾讯云国际版云数据库选型:MySQL、Redis 怎么按业务架构来判断
数据库·mysql·腾讯云
ew4521814 小时前
MySQL JOIN 关联语法、差异、标准用法、经典坑点汇总
数据库·mysql
J_bean18 小时前
剖析 MySQL InnoDB 共享行锁 (S) & 排他行锁 (X)
数据库·mysql·共享行锁·s lock·排他行锁·x lock
技术长镜头19 小时前
别再只说“走 B+Tree”:一条 SQL 在 InnoDB 中的完整寻址过程
后端·mysql
一只fish1 天前
优化器架构对比:Oracle vs PostgreSQL vs MySQL
mysql·postgresql·oracle
buyue__2 天前
Python实现连接MySQL数据库并执行目录下的所有SQL文件,遇到错误时终止执行。
python·mysql
snow@li2 天前
MySQL:库表设计完整规范与实战方案
数据库·mysql