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) ✅ 统计满足条件行数(最简单)
相关推荐
北冥you鱼17 分钟前
Go 语言初始化 MySQL 数据库实战指南:从零到生产环境部署
数据库·mysql·golang
SelectDB37 分钟前
云数仓费钱?用 SelectDB Serverless 三步配出秒级弹性,最高降本 70%
数据库·云原生·数据分析
琢森37 分钟前
服务器崩溃后,我是怎么用一条备份脚本救回全部数据的
mysql
time展天139 分钟前
Dddify:给 ASP.NET Core 项目一套轻量、清晰、可落地的 DDD 基础设施
数据库·后端·asp.net
杜子不疼.1 小时前
【Qt初识】工程起步:项目创建、代码解读与对象树
数据库·c++·qt
SelectDB1 小时前
Agent 场景动态 JSON 性能拆解:Apache Doris 比 ClickHouse 快 7 倍、比 Elasticsearch 快 2 倍
数据库·json·agent
宠友信息1 小时前
MySQL 租户数据隔离在即时通讯源码后端中的落地方式
java·数据库·spring boot·redis·websocket·mysql
wear工程师2 小时前
MySQL 索引失效别再背八股:看懂 EXPLAIN,面试官追问也不慌
mysql·面试
jnrjian2 小时前
PG 切换用户 \c -
数据库·postgresql
Database_Cool_2 小时前
内存数据库持久化方案:阿里云 Tair 持久内存型数据不丢失
数据库·阿里云