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) ✅ 统计满足条件行数(最简单)
相关推荐
辻弋20111 分钟前
一键优化电源计划、游戏模式、独显强制、禁用后台录制——DeltaForceBooster专治三角洲行动卡顿掉帧,所有改动可一键还原
服务器·数据库·windows·游戏·电脑·php
Wang's Blog1 小时前
PostgreSQL笔记51: 基于 pgvector 构建企业级智能问答系统
数据库·笔记·postgresql
我星期八休息1 小时前
Linux—五种IO模型与非阻塞IO
linux·运维·服务器·网络·数据库·网络协议
SQL-First布道者1 小时前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc
AIMath~1 小时前
MVCC 与乐观锁,RR的本质
mysql
翼龙云_cloud2 小时前
阿里云国际版代理商:OSS自定义域名绑定与HTTPS配置排障教程
数据库·阿里云·https·云计算
日常筹谋记2 小时前
ATS选不对运维两行泪:数据中心市电与柴发切换场景的双电源自动转换开关选型笔记
运维·数据库·笔记
小蒜学长2 小时前
vue旅游攻略网站(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端·旅游
山甫aa2 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
JavaPub-rodert3 小时前
MongoDB 常用命令和常见问题大全
数据库·mongodb