SQL 聚合函数完全指南:从基础到实战
一、引言:为什么聚合函数是 SQL 的核心武器?
在数据处理领域,SQL 如同一位全能战士,而聚合函数则是其手中的精锐武器。无论是统计报表、商业分析还是数据清洗,COUNT、MAX、SUM等聚合函数都是高频使用的核心工具。本文将通过系统化的讲解,结合执行顺序解析与实战案例,帮助你彻底掌握 SQL 聚合函数的使用精髓。
二、目录
- COUNT 函数:数据统计的多面手
- MAX/MIN:极值查询的快速通道
- SUM/AVG:从总量到均值的分析利器
- 业务场景实战:ROI 计算与数据洞察
- 执行顺序深度解析:为什么顺序决定结果?
- 避坑指南:聚合函数的常见误区
三、核心函数详解:从语法到本质
3.1 COUNT 函数:数据统计的多面手
3.1.1 函数本质
统计符合条件的行数量,根据参数不同分为三种模式:
- COUNT(*):统计所有行(包括重复行和 NULL 值)
- COUNT(column):统计指定列非 NULL 的行(允许重复值)
- COUNT(DISTINCT column):统计指定列去重且非 NULL 的行
3.1.2 实战案例
TypeScript
取消自动换行复制
-- 统计女性用户数量
SELECT COUNT(*) AS female_count
FROM account_2c
WHERE gender = '女';
执行顺序解析:
- FROM 确定数据源表account_2c
- WHERE 过滤出gender='女'的行
- SELECT 对过滤后的结果集执行COUNT(*)统计总行数
3.1.3 关键区别对比
语法 |
统计范围 |
忽略 NULL |
去重处理 |
COUNT(*) |
所有行 |
否 |
否 |
COUNT(column) |
该列值非 NULL 的行 |
是 |
否 |
COUNT(DISTINCT) |
该列值非 NULL 且唯一的行 |
是 |
是 |
3.2 MAX/MIN:极值查询的快速通道
3.2.1 核心作用
- MAX(column):返回指定列的最大值
- MIN(column):返回指定列的最小值
3.2.2 时间范围查询案例
TypeScript
取消自动换行复制
-- 查询双11前15天的最高订单金额
SELECT MAX(total_price) AS max_price
FROM orders
WHERE order_time BETWEEN '2020-11-01 00:00:00' AND '2020-11-15 00:00:00';
-- 查询最早的订单时间
SELECT MIN(order_time) AS min_time
FROM orders
WHERE order_time BETWEEN '2020-11-01 00:00:00' AND '2020-11-15 00:00:00';
执行要点:
- 极值函数忽略 NULL 值,但会处理所有非 NULL 数据(包括重复值)
- 时间类型字段可直接进行大小比较,返回精确时间戳
3.3 SUM/AVG:从总量到均值的分析利器
3.3.1 SUM:数据累加器
TypeScript
取消自动换行复制
-- 计算双11前15天总销售额并计算ROI(假设成本50000)
SELECT SUM(total_price) AS total_sales,
SUM(total_price)/50000 AS ROI -- ROI=产出/投入
FROM orders
WHERE order_time BETWEEN '2020-11-01 00:00:00' AND '2020-11-15 00:00:00';
业务含义:
- ROI>1:盈利(产出 > 投入)
- ROI=1:收支平衡
- ROI<1:亏损
3.3.2 AVG:均值计算器
TypeScript
取消自动换行复制
-- 计算平均订单价格
SELECT AVG(total_price) AS avg_price
FROM orders
WHERE order_time BETWEEN '2020-11-01 00:00:00' AND '2020-11-15 00:00:00';
注意:AVG 仅计算非 NULL 值,若整列全为 NULL 则返回 NULL
四、执行顺序:决定结果的隐形规则
4.1 核心执行流程(以 COUNT 案例为例)
TypeScript
取消自动换行复制
SELECT COUNT(*) AS count_number -- 第5步:计算聚合函数并命名列
FROM account_2c -- 第1步:确定数据源
WHERE gender = '女' -- 第2步:过滤行数据
完整执行顺序(必记!):
- FROM → 2. WHERE → 3. GROUP BY → 4. HAVING → 5. SELECT → 6. DISTINCT → 7. ORDER BY → 8. LIMIT
4.2 为什么顺序重要?
- WHERE 先于 SELECT:聚合函数只能处理 WHERE 过滤后的结果
- GROUP BY 改变作用域:带 GROUP BY 时,聚合函数按分组计算(见拓展案例)
五、避坑指南:三大常见误区
- COUNT(*) vs COUNT(1)
- 性能几乎无差异,COUNT (*) 是标准写法,可读性更强
- NULL 值陷阱
- COUNT (column) 自动忽略 NULL,若需统计包含 NULL 的行,需用COUNT(IF(column IS NULL, 1, NULL))
- GROUP BY 搭配错误
- SELECT 中出现的非聚合列必须包含在 GROUP BY 中(SQL 标准要求)
六、总结:构建聚合函数知识体系
函数 |
作用 |
核心参数 |
执行阶段 |
COUNT |
行数统计 |
* / column / DISTINCT |
SELECT |
MAX/MIN |
极值查询 |
column |
SELECT |
SUM/AVG |
求和 / 均值 |
column |
SELECT |
掌握聚合函数的关键在于:
- 明确数据过滤顺序(FROM→WHERE→SELECT)
- 区分行级过滤(WHERE)与分组过滤(HAVING)
- 理解聚合函数对 NULL 值的处理规则
七、拓展思考:进阶应用场景
- 分组统计:如何用 GROUP BY 计算各性别用户的平均消费?
- 窗口函数:聚合函数与 OVER () 结合实现滚动统计
- 性能优化:COUNT (*) 在索引表与非索引表的效率差异
花无凋零之日,意无传递之时,爱情亘古不变,紫罗兰与世长存。