COUNT(column) 与 COUNT(*) 在 SQL 中的比较 — 解释 INNER、LEFT、RIGHT 与 FULL JOIN
发布: (2026年2月24日 GMT+8 16:57)
2 分钟阅读
原文: Dev.to
Source: Dev.to
COUNT(*) 与 COUNT(column) 概述
COUNT(*)– 统计查询返回的每一行。COUNT(column)– 只统计指定列中非 NULL 的值。
理解这一区别至关重要,尤其在涉及连接(JOIN)时。
INNER JOIN 示例
查询
SELECT c.id,
COUNT(*) AS total_rows,
COUNT(o.id) AS orders_count
FROM customers c
INNER JOIN orders o
ON c.id = o.customer_id
GROUP BY c.id;
结果
| id | total_rows | orders_count |
|---|---|---|
| 1 | 2 | 2 |
| 2 | 1 | 1 |
为什么?
INNER JOIN 会丢弃在连接表中没有匹配项的行。因此,结果集中出现的每一行其 o.id 都不是 NULL,导致 COUNT(*) 与 COUNT(o.id) 相等。
LEFT JOIN 示例(大多数错误出现的地方)
查询
SELECT c.id,
COUNT(*) AS total_rows,
COUNT(o.id) AS orders_count
FROM customers c
LEFT JOIN orders o
ON c.id = o.customer_id
GROUP BY c.id;
结果
| id | total_rows | orders_count |
|---|---|---|
| 1 | 2 | 2 |
| 2 | 1 | 1 |
| 3 | 1 | 0 |
为什么 Carol 不同?
LEFT JOIN 会保留左表(customers)的所有行。对于没有匹配订单的客户(例如 Carol),连接后的列(o.id)为 NULL。
COUNT(*)统计整行本身,得到 1。COUNT(o.id)会忽略NULL值,得到 0。
要点
COUNT(*)始终反映查询产生的行数,不受列值影响。COUNT(column)只统计该列 非NULL的行。- 在外连接(
LEFT、RIGHT、FULL)中,连接产生的NULL值会导致COUNT(column)与COUNT(*)不一致。 - 使用合适的
COUNT形式可避免报告错误,确保仪表盘显示的指标准确。