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;

结果

idtotal_rowsorders_count
122
211

为什么?
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;

结果

idtotal_rowsorders_count
122
211
310

为什么 Carol 不同?
LEFT JOIN 会保留左表(customers)的所有行。对于没有匹配订单的客户(例如 Carol),连接后的列(o.id)为 NULL

  • COUNT(*) 统计整行本身,得到 1
  • COUNT(o.id) 会忽略 NULL 值,得到 0

要点

  • COUNT(*) 始终反映查询产生的行数,不受列值影响。
  • COUNT(column) 只统计该列 NULL 的行。
  • 在外连接(LEFTRIGHTFULL)中,连接产生的 NULL 值会导致 COUNT(column)COUNT(*) 不一致。
  • 使用合适的 COUNT 形式可避免报告错误,确保仪表盘显示的指标准确。
0 浏览
Back to Blog

相关文章

阅读更多 »

小事,大影响

!尾随逗号示例https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s...