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

相关推荐
爱莉希雅&&&19 小时前
Ansible+Docker案例(含ansible配置安装docker)
linux·运维·mysql·nginx·docker·容器·ansible
SarL EMEN19 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
银河系的一束光19 小时前
net start mysql 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助
数据库·mysql
untE EADO19 小时前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
android·sql·mysql
西北奇妙的八角20 小时前
mysql大表结构变更导致主从延迟问题复盘
mysql
y = xⁿ20 小时前
MySQL学习日记:关于MVCC及一些八股总结
数据库·学习·mysql
BING_Algorithm20 小时前
JDBC核心教程
java·后端·mysql
ting945200021 小时前
MySQL 安全加固十大硬核操作
mysql
阿丰资源1 天前
基于SpringBoot+MySQL的在线拍卖系统设计与实现(附源码)
spring boot·后端·mysql
牛马鸡niumasi1 天前
MySQL:ENUM、SET与查询技巧
mysql