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语言中文网

相关推荐
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H3 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
这个DBA有点耶4 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵4 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking4 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
李白客6 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
Jim6008 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL8 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql