MySQL COUNT 用法详解

在日常 SQL 开发中,统计数据是最常见的需求之一,而 COUNT 函数就是最核心的统计工具。


文章目录

    • [一、COUNT 函数是什么?](#一、COUNT 函数是什么?)
      • [1. 基本定义](#1. 基本定义)
    • [二、COUNT 的三种常见用法](#二、COUNT 的三种常见用法)
      • [1. COUNT(*)](#1. COUNT(*))
      • [2. COUNT(1)](#2. COUNT(1))
      • [3. COUNT(列名)](#3. COUNT(列名))
    • [三、COUNT(*) vs COUNT(1) vs COUNT(列)](#三、COUNT(*) vs COUNT(1) vs COUNT(列))
    • [四、COUNT 与 WHERE 条件](#四、COUNT 与 WHERE 条件)
      • [1. 条件统计](#1. 条件统计)
      • [2. 多条件统计](#2. 多条件统计)
      • [3. 可以和IF结合使用](#3. 可以和IF结合使用)
    • [五、COUNT + GROUP BY](#五、COUNT + GROUP BY)
      • [1. 分组统计](#1. 分组统计)
      • [2. 分组 + 条件](#2. 分组 + 条件)
    • [六、COUNT + DISTINCT(去重统计)](#六、COUNT + DISTINCT(去重统计))
      • [1. 基本用法](#1. 基本用法)
      • [2. 多列去重(MySQL 支持)](#2. 多列去重(MySQL 支持))
    • [七、COUNT 的执行原理](#七、COUNT 的执行原理)
      • [1. InnoDB 表](#1. InnoDB 表)
      • [2. MyISAM 表](#2. MyISAM 表)
      • [3. 为什么 COUNT(*) 推荐?](#3. 为什么 COUNT(*) 推荐?)
    • 八、性能优化建议
      • [1. 优先使用 COUNT(*)](#1. 优先使用 COUNT(*))
      • [2. 利用索引](#2. 利用索引)
      • [3. 避免全表扫描](#3. 避免全表扫描)
    • 参考

一、COUNT 函数是什么?

1. 基本定义

COUNT 是一个聚合函数,用于统计行数。

基本语法:

sql 复制代码
COUNT(expression)

作用:

统计符合条件的记录数量。


二、COUNT 的三种常见用法

1. COUNT(*)

sql 复制代码
SELECT COUNT(*) FROM user;

特点:

  • 统计表中所有行
  • 包含 NULL
  • 最常用

👉 推荐使用


2. COUNT(1)

sql 复制代码
SELECT COUNT(1) FROM user;

特点:

  • 统计所有行
  • 本质和 COUNT(*) 一样

👉 和 COUNT(*) 性能基本一致


3. COUNT(列名)

sql 复制代码
SELECT COUNT(email) FROM user;

特点:

  • 只统计该列 不为 NULL 的行

示例:

id email
1 a@qq.com
2 NULL

结果:

plain 复制代码
COUNT(email) = 1

三、COUNT(*) vs COUNT(1) vs COUNT(列)

写法 是否统计 NULL 含义
COUNT(*) 所有行
COUNT(1) 所有行
COUNT(列名) 非 NULL 行

一句话总结:

COUNT() = COUNT(1),COUNT(列) ≠ COUNT()


四、COUNT 与 WHERE 条件

1. 条件统计

sql 复制代码
SELECT COUNT(*) FROM orders WHERE status = 'paid';

含义:

统计已支付订单数量。


2. 多条件统计

sql 复制代码
SELECT COUNT(*)
FROM orders
WHERE amount > 100 AND status = 'paid';

3. 可以和IF结合使用

具体IF和IFNULL用法可参考MySQL IF 和 IFNULL 用法详解-CSDN博客


五、COUNT + GROUP BY

1. 分组统计

sql 复制代码
SELECT status, COUNT(*)
FROM orders
GROUP BY status;

结果示例:

status count
paid 10
unpaid 5

2. 分组 + 条件

sql 复制代码
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;

六、COUNT + DISTINCT(去重统计)

1. 基本用法

sql 复制代码
SELECT COUNT(DISTINCT user_id) FROM orders;

含义:

统计不同用户数量。


2. 多列去重(MySQL 支持)

sql 复制代码
SELECT COUNT(DISTINCT user_id, product_id)
FROM orders;

七、COUNT 的执行原理

1. InnoDB 表

  • 不保存总行数
  • 需要扫描数据

2. MyISAM 表

  • 保存行数
  • COUNT(*) 速度快

3. 为什么 COUNT(*) 推荐?

原因:

  • 语义清晰
  • 优化器会优化
  • 可利用索引

八、性能优化建议

1. 优先使用 COUNT(*)

sql 复制代码
SELECT COUNT(*) FROM table;

2. 利用索引

sql 复制代码
SELECT COUNT(id) FROM user;

如果 id 是主键索引,会更快。


3. 避免全表扫描

大表建议:

  • 使用缓存
  • 使用统计表

参考

SQL COUNT() 函数 | 菜鸟教程

MySQL COUNT()函数的用法 - C语言中文网

相关推荐
数据库小学妹1 小时前
数据库连接池避坑指南:告别“连接超时”与“资源耗尽”,让系统跑得更快!
数据库·redis·sql·mysql·缓存·dba
前进的李工2 小时前
EXPLAIN输出格式全解析:JSON、TREE与可视化
开发语言·数据库·mysql·性能优化·explain
达梦产品与服务2 小时前
稳扎稳打,持续迭代 | SQLark V3.10 更新,30+ 项优化与修复
mysql·oracle·达梦数据库·pg·sqlark百灵连接
shizhan_cloud4 小时前
MySQL 索引优化 + 慢查询日志
数据库·mysql
Drache_long4 小时前
MySQL数据库(故障排除)
数据库·mysql
shaoming37765 小时前
浏览器动作开发:地址栏图标点击事件、弹出页面设计
android·mysql·adb
Riu_Peter10 小时前
【技术】Docker 部署 MySQL
mysql·adb·docker
Irene199110 小时前
SQL示例:外键约束是关系型数据库中用于建立两个表之间链接的一种规则
mysql
zshs00010 小时前
从 Raft 到 MySQL:我是怎么推导出半同步复制原理的
数据库·分布式·mysql
这个DBA有点耶10 小时前
MySQL深分页优化:从LIMIT 1000000,10到毫秒级响应的三种写法
数据库·程序人生·mysql·性能优化·学习方法·dba·改行学it