讲解

聚合函数把多行数据「压缩」成一个值,是统计分析的基础。最常用的五个:COUNT 计数、SUM 求和、AVG 平均值、MIN 最小值、MAX 最大值。SELECT COUNT(*) FROM orders 数订单总数;SELECT SUM(amount) FROM orders 算订单总额。它们对整个结果集做计算,返回恰好一行。

COUNT 有三个形态要分清:COUNT(*) 数所有行;COUNT(列名) 只数该列非 NULL 的行;COUNT(DISTINCT 列名) 数去重后的非 NULL 值个数。SUM 和 AVG 只统计非 NULL 的值,且对空结果集返回 NULL(不是 0)——用 COALESCE(SUM(amount), 0) 可以兜底。AVG 在 SQLite 里返回浮点数,在 SQL Server 等对整数列求平均可能做整数运算,跨库时注意。

聚合函数和普通列混选时有个铁律:SELECT status, COUNT() FROM orders 这种写法在大多数数据库里是语法错误,因为 status 每行不同而 COUNT() 只有一个值,数据库不知道显示哪个 status。要么只选聚合结果,要么配合 GROUP BY 明确「每组一个聚合值」——这正是下一章的主题。SQLite 对此比较宽容会随便给你一个值,但这种「宽容」恰恰是隐患。

示例

订单的基本盘:总单数、总金额、平均客单价、最大与最小单笔金额:

SELECT COUNT(*) AS order_count, SUM(amount) AS total, AVG(amount) AS avg_amount, MAX(amount) AS max_amount, MIN(amount) AS min_amount FROM orders;

只看已支付订单的统计(聚合前先用 WHERE 筛选):

SELECT COUNT(*) AS paid_count, SUM(amount) AS paid_total FROM orders WHERE status = 'paid';

COUNT 的三种形态对比:学生总数、填了城市的人数、不同城市的个数:

SELECT COUNT(*) AS total, COUNT(city) AS city_filled, COUNT(DISTINCT city) AS city_kinds FROM students;

常见坑

  • 聚合列与普通列裸混:SELECT name, COUNT(*) FROM students 在 MySQL(ONLY_FULL_GROUP_BY 模式)和 PostgreSQL 里直接报错,SQLite 则返回一个不确定的 name。混选请配合 GROUP BY。
  • 对空集期待 SUM 返回 0:没有符合条件的行时 SUM 返回 NULL 而不是 0,程序里直接拿去做加法可能报错。用 COALESCE(SUM(col), 0) 兜底。
  • AVG 的口径问题:AVG 跳过 NULL,「平均分」统计的只是有成绩的人;另外部分数据库对整数列求 AVG 会截断小数,必要时先转成浮点。
  • 在 WHERE 里直接用聚合函数:WHERE COUNT(*) > 5 是语法错误。对聚合结果做筛选要用 HAVING,再下一章就讲。

小结

COUNT、SUM、AVG、MIN、MAX 把多行聚成一行;COUNT 三种形态语义不同,聚合跳过 NULL,空集 SUM 得 NULL。下一节用 GROUP BY 按组聚合。