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) ✅ 统计满足条件行数(最简单)
相关推荐
znnnk6 小时前
数据库被AI“重写”:2026,从CPU中心走向GPU中心
数据库·人工智能·oracle
微微%6 小时前
mysql的安装和使用
数据库·mysql·mysql8安装
软件派7 小时前
MiniMax M3.1 Flash 高频业务落地实战指南
大数据·数据库·人工智能
云边云科技_云网融合8 小时前
连锁门店组网怎么做?SD-WAN 多分支组网的架构选型、部署与成本结构
服务器·数据库·php
泡海椒8 小时前
# 深度解析JQuick-SQL Join重排序与哈希连接执行机制
数据库·sql·哈希算法
acrel79 小时前
医院用电隐患治理与节能降耗及智慧能源平台应用
网络·数据库
snow@li9 小时前
PowerDesigner 全景教程:从业务建模、表结构设计、关系管理到正向/逆向、文档输出
数据库
ss2739 小时前
PostgreSQL表级锁、行级锁、轻量级锁
数据库·postgresql·区块链
RacentCLM10 小时前
证书即服务CaaS:从申请、续期到部署的自动化链路拆解
运维·数据库·自动化·ssl
SelectDB10 小时前
安全评审卡了三周,我把部署形态的四种选项重新排了一遍
大数据·数据库·云原生