SQL 聚合函数
SQL 聚合函数把一组行压缩成统计值,常见包括 COUNT、SUM、AVG、MIN、MAX,并需要正确理解 NULL 语义。
#concept
#growing
#backend
#sql
#database
[!info] related notes
- 所属 MOC: database-moc
- 前置概念: sql-group-by
- 并列概念: sql-join
- 易混淆概念:
- 关系笔记: sql-join-group-by-and-aggregation、sql-having-vs-where
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。