mysql的坑 - count计数

MySQL 中 count()函数能不能传表达式?如count(id>10)

结论:能传表达式,但结果 99% 不是你想要的!
踩了好多次的坑

我用最简单的话给你讲清楚:

  1. 先告诉你真相

    COUNT(表达式) 不会统计 "满足条件的行数"它只会统计:表达式结果不为 NULL 的行数

    你以为的效果(错)

    sql 复制代码
    count(id>10)  →  统计 id>10 的记录数

    实际效果(对)

    sql 复制代码
    count(id>10)  →  统计 【id>10 这个表达式结果不为 NULL】 的行数
  2. 为什么你的写法结果不对?

    id>10 是一个条件表达式,它只会返回两种值:

    条件成立 → 返回 1

    条件不成立 → 返回 0

    重点:1 和 0 都不是 NULL所以 count(id>10) 等价于:

    sql 复制代码
    count(*)  →  统计表总行数

    不管 id 是多少,只要这行存在,就会被计数!

  3. 正确写法(必须这样写)

    写法 1:用 IF 让不满足条件的返回 NULL

    sql 复制代码
    COUNT(IF(id>10, 1, NULL))

    满足 → 1(计数)

    不满足 → NULL(不计数)

    写法 2:用 CASE(最常用、最清晰)

    sql 复制代码
    COUNT(CASE WHEN id>10 THEN 1 END)

    写法 3:直接用 SUM(最简单)

    sql 复制代码
    SUM(id>10)

    因为 id>10 成立 = 1,不成立 = 0,求和就是符合条件的数量。

    写法 4:放 WHERE 里(最简单)

    sql 复制代码
    SELECT COUNT(*) FROM 表 WHERE id>10;
  4. 一句话总结

    count(条件) 不生效

    count(条件=真返回1,否则返回NULL) 才生效

    sum(条件) 最简单

    快速记忆版(面试 / 工作必背)

    写法 效果
    count(id>10) ❌ 统计总行数(错)
    count(if(id>10,1,null)) ✅ 统计满足条件行数
    sum(id>10) ✅ 统计满足条件行数(最简单)
相关推荐
写后端的胖头鱼1 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
路远的数据库笔记1 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰1 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
kaiyou20262 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习
mjhcsp2 小时前
DeepSeek V4.1 Flash 批量处理效能实测
java·前端·数据库
ShineWinsu2 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
lie..2 小时前
30天从零开始学AI应用开发(Day 17):ChromaDB 上手:给本地文档建一个“外挂大脑”
数据库·人工智能·oracle
code_whiter3 小时前
01-MySQL数据库基础
数据库·mysql
weixin_382395233 小时前
本地部署 ERP 选型记录:从 Excel 到轻量系统的这几年
数据库·人工智能·数据挖掘
2401_891409263 小时前
期货量化用得上的几类行情数据:逐笔、Level2、分钟线和五档tick
数据库