SQLPathLab
SQL 实战指南 · MySQL 8.0

COUNT(*)、COUNT(字段) 与 COUNT DISTINCT

三种统计回答的是行数、非空值数和不同值数。

问题与判断方法

COUNT(*) 统计筛选结果中的行数;COUNT(字段) 忽略该字段为 NULL 的行;COUNT(DISTINCT 字段) 再进一步去除重复非空值。选择错误会改变指标含义,而不只是写法不同。

统计客户数时,如果订单表中一个客户有多笔订单,COUNT(*) 得到订单数,COUNT(DISTINCT customer_id) 才接近客户数。JOIN 后还应先检查关系是否放大行数。

为统计列使用能表达业务含义的别名,例如 order_count、known_phone_count、customer_count,避免统一命名为 total。

示例

示例数据表

表名:customers
customers
nickname
NULL
Bobby
NULL

优化前 / 不推荐

SELECT COUNT(nickname) AS nickname_count FROM customers;

优化前运行结果

result
nickname_count
1

优化后 / 推荐

SELECT COUNT(*) AS total_rows, COUNT(nickname) AS known_nicknames, COUNT(DISTINCT city) AS cities FROM customers;

优化后运行结果

result
total_rowsknown_nicknamescities
3 1 3

为什么这样更好:同时展示总行数、非 NULL 昵称数和不同城市数,避免把三个业务指标混成一个 COUNT。

这篇内容是否清楚?