小木的学习日记-SQL函数-聚合函数

SQL 聚合函数完全指南:从基础到实战​

一、引言:为什么聚合函数是 SQL 的核心武器?​

在数据处理领域,SQL 如同一位全能战士,而聚合函数则是其手中的精锐武器。无论是统计报表、商业分析还是数据清洗,COUNT、MAX、SUM等聚合函数都是高频使用的核心工具。本文将通过系统化的讲解,结合执行顺序解析与实战案例,帮助你彻底掌握 SQL 聚合函数的使用精髓。​

二、目录​

  1. COUNT 函数:数据统计的多面手​
  1. MAX/MIN:极值查询的快速通道​
  1. SUM/AVG:从总量到均值的分析利器​
  1. 业务场景实战:ROI 计算与数据洞察​
  1. 执行顺序深度解析:为什么顺序决定结果?​
  1. 避坑指南:聚合函数的常见误区​

三、核心函数详解:从语法到本质​

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 = '女';​

执行顺序解析:​

  1. FROM 确定数据源表account_2c​
  1. WHERE 过滤出gender='女'的行​
  1. 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步:过滤行数据​

完整执行顺序(必记!):​

  1. 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 时,聚合函数按分组计算(见拓展案例)​

五、避坑指南:三大常见误区​

  1. COUNT(*) vs COUNT(1)​
  • 性能几乎无差异,COUNT (*) 是标准写法,可读性更强​
  1. NULL 值陷阱​
  • COUNT (column) 自动忽略 NULL,若需统计包含 NULL 的行,需用COUNT(IF(column IS NULL, 1, NULL))​
  1. GROUP BY 搭配错误​
  • SELECT 中出现的非聚合列必须包含在 GROUP BY 中(SQL 标准要求)​

六、总结:构建聚合函数知识体系​

函数​

作用​

核心参数​

执行阶段​

COUNT​

行数统计​

* / column / DISTINCT​

SELECT​

MAX/MIN​

极值查询​

column​

SELECT​

SUM/AVG​

求和 / 均值​

column​

SELECT​

掌握聚合函数的关键在于:​

  1. 明确数据过滤顺序(FROM→WHERE→SELECT)​
  1. 区分行级过滤(WHERE)与分组过滤(HAVING)​
  1. 理解聚合函数对 NULL 值的处理规则​

七、拓展思考:进阶应用场景​

  1. 分组统计:如何用 GROUP BY 计算各性别用户的平均消费?​
  1. 窗口函数:聚合函数与 OVER () 结合实现滚动统计​
  1. 性能优化:COUNT (*) 在索引表与非索引表的效率差异

花无凋零之日,意无传递之时,爱情亘古不变,紫罗兰与世长存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值