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) ✅ 统计满足条件行数(最简单)
相关推荐
李高钢40 分钟前
Python FastAPI 框架入门:从零搭建你的第一个高性能 API 服务
数据库·python·fastapi
toooooop81 小时前
MySQL source导入实战:踩坑记,phpMyAdmin 502、source导入巨慢问题解决
mysql
yuzhiboyouye2 小时前
那xml对应的sql语法,列举一下
xml·数据库·sql
. . . . .3 小时前
乐观锁 vs 悲观锁
数据库·sql
Leo.yuan3 小时前
2026年多数据库实时同步的四种架构方案及工具推荐
数据库·架构
hasty3 小时前
Origin 校验不是身份认证:MySQL MCP Server 漏洞给 AI 平台的警告
数据库·mysql·安全
梦想平凡4 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
凤山老林4 小时前
Spring Boot 整合 Flowable 的企业级落地指南
数据库·spring boot·后端·flowable·工作流
企业数字化笔记5 小时前
AI写的系统出现504怎么办?接口超时和数据库慢查询排查
数据库·后端
2601_962218615 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法