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

相关推荐
FYKJ_201043 分钟前
SSM校园失物招领系统41452-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·typescript·spark
哭泣方源炼蛊1 小时前
正则表达式c++内容汇集
数据库·c++·mysql·正则表达式
不恋水的雨3 小时前
gbase中union all导致末尾多出空格的坑
数据库·sql·mysql
念念不忘 必有回响5 小时前
MySQL 事务与隔离级别完全指南
数据库·mysql
lusklusklusk5 小时前
Sqlserver_Oracle_Mysql_Postgresql表_索引碎片或膨胀的知识点汇总
mysql·oracle·sqlserver
71-36 小时前
MySQL密码重置
数据库·笔记·学习·mysql
酷虎软件7 小时前
视频加标题字幕 API 接口文档
java·数据库·mysql
夜雪一千7 小时前
MySQL 触发器有哪些应用场景?从入门场景到避坑实战
数据库·mysql
FYKJ_20107 小时前
springboot贺州地方新闻网站87812-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·django·课程设计
IT毕设梦工厂7 小时前
计算机毕业设计选题推荐:基于大数据的培训机构信息分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·mysql·数据挖掘·数据分析·spark·课程设计