第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;
相关推荐
毕业设计70320 分钟前
(免费领源码)django空气净化器销售系统09218- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
python·scrapy·mysql·pycharm·django·flask·pandas
CJi0NG2 小时前
【自用】MySQL-事务
数据库·mysql
VX_bysjlw9852 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
PHP实战开发录2 小时前
MySQL数字排序为什么乱
数据库·mysql·php
imDwAaY6 小时前
一条 SQL 发出去之后,MySQL 到底做了什么?
sql·mysql
March.s8 小时前
MySQL 数据库原理与实战:从数据管理到 LAMP 建站全解
数据库·mysql
悟道子HD8 小时前
网络安全基本功——MySQL基础
android·mysql·web安全
晚风叙码8 小时前
MySQL 增删改查(CRUD)完全指南:从入门到面试
数据库·mysql·面试
程序员Sunday21 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
Yyyyyy~21 小时前
[ Mysql ] 库的操作
mysql