COUNT(*)、COUNT(字段) 与 COUNT DISTINCT
三种统计回答的是行数、非空值数和不同值数。
问题与判断方法
COUNT(*) 统计筛选结果中的行数;COUNT(字段) 忽略该字段为 NULL 的行;COUNT(DISTINCT 字段) 再进一步去除重复非空值。选择错误会改变指标含义,而不只是写法不同。
统计客户数时,如果订单表中一个客户有多笔订单,COUNT(*) 得到订单数,COUNT(DISTINCT customer_id) 才接近客户数。JOIN 后还应先检查关系是否放大行数。
为统计列使用能表达业务含义的别名,例如 order_count、known_phone_count、customer_count,避免统一命名为 total。
示例
示例数据表
表名:
customers| nickname |
|---|
| NULL |
| Bobby |
| NULL |
优化前 / 不推荐
SELECT COUNT(nickname) AS nickname_count FROM customers;优化前运行结果
| nickname_count |
|---|
| 1 |
优化后 / 推荐
SELECT COUNT(*) AS total_rows, COUNT(nickname) AS known_nicknames, COUNT(DISTINCT city) AS cities FROM customers;优化后运行结果
| total_rows | known_nicknames | cities |
|---|---|---|
| 3 | 1 | 3 |
为什么这样更好:同时展示总行数、非 NULL 昵称数和不同城市数,避免把三个业务指标混成一个 COUNT。
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。