条件计数
sql求所有女生的人数:
讲一下这句代码,case干啥的,括号里那句啥意思
SELECT COUNT(case when Type='女' then Type end) FROM
你问的这个问题很核心,它把 条件计数 的一个经典写法讲清楚了。
先给结论:
这个写法正确、好用,CASE 在这里的作用是:只在 Type='女' 时返回一个非 NULL 值,否则返回 NULL,然后 COUNT 只数非 NULL 的行,从而实现“只统计女生人数”。
下面我从里到外,逐层拆解。
一、先看完整语句
sql
SELECT COUNT(CASE WHEN Type = '女' THEN Type END)FROM student;
执行逻辑一句话:
对
student表中每一行,如果Type='女',就“给一个值”,否则“不给值”,最后数一下“给了值”的行数。
二、CASE 在 SQL 里是啥?
CASE 是 SQL 的 条件表达式,相当于其他语言里的 if ... then ... else ...。
基本语法:
sql
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ELSE 结果3END
特点:
返回一个值
不改变表结构
可以写在
SELECT、WHERE、ORDER BY、聚合函数内部
三、你这一句里的 CASE 到底在干什么?
sql
CASE WHEN Type = '女' THEN Type END
逐段解释:
| 部分 | 含义 |
|---|---|
CASE | 开始条件判断 |
WHEN Type = '女' | 如果当前行的 Type 字段等于 '女' |
THEN Type | 则返回 Type 的值(即 '女') |
END | 结束 |
隐含的 ELSE | 你没写,SQL 会默认 ELSE NULL |
对于不同行:
| Type 值 | CASE 返回 |
|---|---|
'女' | '女'(非 NULL) |
'男' | NULL |
其他值(如 NULL) | NULL |
关键点:
不满足条件的行 → 返回
NULL。
四、COUNT() 遇到 NULL 会怎样?
COUNT(表达式) 只统计表达式的值不为 NULL 的行。
COUNT('女')→ 数 1 次COUNT(NULL)→ 不数
所以:
sql
COUNT(CASE WHEN Type='女' THEN Type END)
等价于:
对每一行:
如果是女生 → 给一个非
NULL值 → 计数 +1如果不是女生 → 给
NULL→ 不计
最终结果 = 女生人数 ✅
五、和另一种写法对比(非常重要)
很多初学者会写成:
sql
-- ❌ 错误示范SELECT COUNT(Type) FROM student WHERE Type = '女';
这个虽然也能得到女生人数,但语义不同:
| 写法 | 含义 |
|---|---|
WHERE Type='女' | 先过滤,再统计 |
COUNT(CASE...) | 不过滤,在计数时选择性统计 |
区别在于:
如果你还要同时统计男生、总人数,
WHERE就做不到CASE写法可以 一次遍历完成多种统计
示例:
sql
SELECT COUNT(CASE WHEN Type='女' THEN 1 END) AS 女生数, COUNT(CASE WHEN Type='男' THEN 1 END) AS 男生数, COUNT(*) AS 总人数FROM student;
这是一次扫描、三个统计结果,效率高,语义清晰。
六、用 SUM 也能实现(更常见的写法)
更常见、也更“SQL风格”的写法其实是:
sql
SELECT SUM(CASE WHEN Type='女' THEN 1 ELSE 0 END) FROM student;
| 对比 | COUNT + CASE | SUM + CASE |
|---|---|---|
| 女生行返回 | 非 NULL('女') | 1 |
| 非女生行返回 | NULL | 0 |
| 结果 | 3(COUNT 忽略 NULL) | 3(1+0+1+...) |
| 推荐度 | ✅ 正确 | ✅✅ 更清晰 |
SUM 写法更直观:
是女生 → 加 1,不是 → 加 0。
七、你这一句代码的完整执行过程
假设 student 表:
| id | Type |
|---|---|
| 1 | 女 |
| 2 | 男 |
| 3 | 女 |
| 4 | 男 |
执行:
sql
SELECT COUNT(CASE WHEN Type='女' THEN Type END)
内部过程:
第 1 行:
Type='女'→CASE返回'女'→COUNT计数 +1第 2 行:
Type='男'→CASE返回NULL→ 不计第 3 行:
Type='女'→ 计数 +1第 4 行:
Type='男'→ 不计
最终结果:2
✅ 正确统计了所有女生人数。
八、总结(你关心的点)
| 问题 | 回答 |
|---|---|
CASE 干啥的 | 条件表达式,相当于 if |
| 括号里那句啥意思 | 女生行返回非 NULL,其他行返回 NULL |
| 为什么能统计女生人数 | COUNT 只计非 NULL 值 |
和 SUM(CASE...) 区别 | 结果一样,SUM 更直观,但你的写法完全正确 |
| 会不会错 | 不会,这是经典的“条件计数”写法 |
一句话终极理解
CASE负责“决定这一行要不要被数”,COUNT负责“只数那些被标记为‘要数’的行”。
你写的这句 SQL,完全正确且风格老练。