← [ BACK_TO_NOTES ]

SQL 聚合函数

SQL 聚合函数把一组行压缩成统计值,常见包括 COUNT、SUM、AVG、MIN、MAX,并需要正确理解 NULL 语义。

#concept #growing #backend #sql #database

[!info] related notes

SQL 聚合函数

一句话定义

聚合函数把一组输入行计算成一个统计结果;与 GROUP BY 配合时,会对每个分组分别计算。

常见函数

COUNT  计数
SUM    求和
AVG    平均值
MIN    最小值
MAX    最大值
SELECT
  user_id,
  COUNT(*) AS order_count,
  SUM(amount) AS total_amount,
  AVG(amount) AS avg_amount
FROM orders
GROUP BY user_id;

COUNT(*) 与 COUNT(column)

这是最常见的边界:

  • COUNT(*):统计结果行数量,不关心某列是不是 NULL。
  • COUNT(column):只统计该列非 NULL 的行。

在 LEFT JOIN 中尤其重要:

SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id;

没有订单的用户仍有一条 JOIN 结果行,但 o.id = NULL,所以 COUNT(o.id) = 0;如果使用 COUNT(*),则可能得到 1。

NULL 语义

多数常见聚合函数会忽略 NULL:

  • SUM(NULL) 不把它当 0 相加;
  • AVG 只对非 NULL 值计算;
  • 如果一组没有任何非 NULL 输入,SUM/AVG/MIN/MAX 常返回 NULL;
  • COUNT(column) 则返回 0。

需要业务默认值时可显式使用 COALESCE。

聚合粒度

不写 GROUP BY 时,整个输入结果通常被视为一个组;写了 GROUP BY 后,聚合粒度由分组键决定。

因此聚合正确性的关键不是先选函数,而是先回答:

我到底要对“哪一组行”计算?

常见风险

  • JOIN 造成重复行后再 SUM,可能重复累计金额。
  • 把 COUNT(*) 和 COUNT(nullable_column) 混用,会产生不同结果。
  • 聚合结果的过滤应使用 HAVING;原始行过滤优先使用 WHERE。
创建于 2026/9/14 更新于 2026/9/14
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本