您好!欢迎访问家园网-www.jy.wang!

家园网

条件计数

网络 作者:本站 点击:

条件计数

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

特点:

  • 返回一个

  • 不改变表结构

  • 可以写在 SELECTWHEREORDER 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
其他值(如 NULLNULL

关键点:

不满足条件的行 → 返回 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 + CASESUM + CASE
女生行返回非 NULL('女'1
非女生行返回NULL0
结果3(COUNT 忽略 NULL)3(1+0+1+...)
推荐度✅ 正确✅✅ 更清晰

SUM 写法更直观:

是女生 → 加 1,不是 → 加 0。


七、你这一句代码的完整执行过程

假设 student 表:

idType
1
2
3
4

执行:

sql

SELECT COUNT(CASE WHEN Type='女' THEN Type END)

内部过程:

  1. 第 1 行:Type='女' → CASE 返回 '女' → COUNT 计数 +1

  2. 第 2 行:Type='男' → CASE 返回 NULL → 不计

  3. 第 3 行:Type='女' → 计数 +1

  4. 第 4 行:Type='男' → 不计

最终结果:2

✅ 正确统计了所有女生人数。


八、总结(你关心的点)

问题回答
CASE 干啥的条件表达式,相当于 if
括号里那句啥意思女生行返回非 NULL,其他行返回 NULL
为什么能统计女生人数COUNT 只计非 NULL 值
和 SUM(CASE...) 区别结果一样,SUM 更直观,但你的写法完全正确
会不会错不会,这是经典的“条件计数”写法

一句话终极理解

CASE 负责“决定这一行要不要被数”,COUNT 负责“只数那些被标记为‘要数’的行”。

你写的这句 SQL,完全正确且风格老练

标签: