select
sum( CASE
WHEN course IS NULL OR course = '' THEN 0
ELSE LENGTH(course) - LENGTH(REPLACE(course, ',', '')) + 1
END) AS staff_nums
from cultivate_tb ct
这道 SQL 题目非常经典,我们来 一步一步、清清楚楚地讲明白它的解题思路。
✅ 题目 SQL:
SELECT
SUM(
CASE
WHEN course IS NULL OR course = '' THEN 0
ELSE LENGTH(course) - LENGTH(REPLACE(course, ',', '')) + 1
END
) AS staff_nums
FROM cultivate_tb ct;
🎯 一、题目目标(我们要解决什么问题?)
虽然没有明确说,但从代码可以看出:
💡 统计表中所有员工所选课程的总数量。
比如:
- 某人
course = 'math'→ 算 1 门 - 某人
course = 'math,english'→ 算 2 门 - 某人
course = null或空 → 算 0 门
👉 最终结果:返回一个总数,叫做 staff_nums —— 实际是“课程报名总人次”。
📌 注意:不是员工人数,而是“总共报了多少门课”。
🧩 二、核心思想拆解(关键洞察)
我们先想一个简单的生活例子:
你有一根香肠,用刀切成几段。
切了 1 刀 → 得到 2 段
切了 2 刀 → 得到 3 段
……
切了 n 刀 → 得到 n+1 段
在本题中:
- “刀” 就是 逗号
, - “段” 就是 一门课程
所以:
✅ 几个逗号 → 就被分成了“逗号数 + 1”个课程!
🔍 三、公式解析:LENGTH - REPLACE + 1 是怎么来的?
这个公式是用来 计算字符串中有多少个指定字符 的通用技巧。
步骤分解:
LENGTH(course) -- 原始长度 - LENGTH(REPLACE(course, ',', '')) -- 去掉所有逗号后的长度 = 逗号的数量 + 1 = 课程数量
✅ 举例说明:
| 5 | 3 | 2 | 3 ✔️ |
| 4 | 4 | 0 | 1 ✔️ |
| 0 | 0 | 0 | 1 ❌(但我们通过 CASE 处理了) |
⚠️ 所以如果直接算会出错:空字符串也会得到 1。
✅ 解决办法就是加上判断:
CASE
WHEN course IS NULL OR course = '' THEN 0
ELSE ... 公式 ...
END
→ 完美避开陷阱!
📚 四、完整解题思路总结(像面试一样回答)
问:请解释这段 SQL 的作用和实现逻辑。
答:
- 目的:统计 cultivate_tb 表中所有记录的 course 字段里,以逗号分隔的课程总数(即“课程报名总人次”)。
- 难点:MySQL 没有内置的“按分隔符拆分并计数”的函数,因此需要借助字符串函数模拟。
- 核心逻辑:每个非空字段中的课程数量 = 逗号数量 + 1使用 LENGTH(str) - LENGTH(REPLACE(str, ',', '')) 来统计逗号个数加上 +1 得到实际项数
- 边界处理:如果字段为 NULL 或空字符串,应返回 0,避免错误计数
- 聚合求和:对每条记录计算其课程数量再用 SUM() 汇总所有记录的结果,得出总人数
- 最终输出:一个名为 staff_nums 的总数,表示所有员工选课的总和。
🧪 五、举个完整例子
假设表数据如下:
'math,english' |
'physics' |
NULL |
'' |
'a,b,c,d' |
逐行分析:
'math,english' | 否 | 1 | 2 |
'physics' | 否 | 0 | 1 |
NULL | 是 | - | 0 |
'' | 是 | - | 0 |
'a,b,c,d' | 否 | 3 | 4 |
👉 总和 = 2 + 1 + 0 + 0 + 4 = 7
运行上面 SQL → 返回 staff_nums = 7 ✔️
✅ 六、可以优化吗?
当然!增强健壮性:
-- 更安全版本:去除前后空格,防止 ' a , b ' 被误判
SELECT
SUM(
CASE
WHEN TRIM(course) = '' OR course IS NULL THEN 0
ELSE LENGTH(course) - LENGTH(REPLACE(course, ',', '')) + 1
END
) AS staff_nums
FROM cultivate_tb ct;
但如果要考虑去重(如 'math,math' 只算一次),那就需要更复杂的拆分逻辑了。
✅ 七、一句话总结解题思路
利用“逗号数量 + 1 = 分隔项数量”的数学关系,结合字符串长度差技巧,在不拆行的前提下快速统计 CSV 字段的元素个数,并通过条件判断处理空值边界,最后汇总得出总人数。



京公网安备 11010502036488号