MySQL 中 count()函数能不能传表达式?如count(id>10)
结论:能传表达式,但结果 99% 不是你想要的!
踩了好多次的坑
我用最简单的话给你讲清楚:
-
先告诉你真相
COUNT(表达式) 不会统计 "满足条件的行数"它只会统计:表达式结果不为 NULL 的行数
你以为的效果(错)
sqlcount(id>10) → 统计 id>10 的记录数实际效果(对)
sqlcount(id>10) → 统计 【id>10 这个表达式结果不为 NULL】 的行数 -
为什么你的写法结果不对?
id>10 是一个条件表达式,它只会返回两种值:
条件成立 → 返回 1
条件不成立 → 返回 0
重点:1 和 0 都不是 NULL所以 count(id>10) 等价于:
sqlcount(*) → 统计表总行数不管 id 是多少,只要这行存在,就会被计数!
-
正确写法(必须这样写)
写法 1:用 IF 让不满足条件的返回 NULL
sqlCOUNT(IF(id>10, 1, NULL))满足 → 1(计数)
不满足 → NULL(不计数)
写法 2:用 CASE(最常用、最清晰)
sqlCOUNT(CASE WHEN id>10 THEN 1 END)写法 3:直接用 SUM(最简单)
sqlSUM(id>10)因为 id>10 成立 = 1,不成立 = 0,求和就是符合条件的数量。
写法 4:放 WHERE 里(最简单)
sqlSELECT COUNT(*) FROM 表 WHERE id>10; -
一句话总结
count(条件) 不生效
count(条件=真返回1,否则返回NULL) 才生效
sum(条件) 最简单
快速记忆版(面试 / 工作必背)
写法 效果 count(id>10) ❌ 统计总行数(错) count(if(id>10,1,null)) ✅ 统计满足条件行数 sum(id>10) ✅ 统计满足条件行数(最简单)