【MySQL 从 0 讲解系列】深入理解 GROUP BY 的本质与应用(含SQL示例+面试题)
🔍【MySQL 从 0 讲解系列】深入理解 GROUP BY 的本质与应用(含SQL示例+面试题)
GROUP BY
是 SQL 查询中最常见也最核心的语法之一,尤其在进行数据统计分析时不可或缺。然而,很多初学者对它理解不深,经常和 DISTINCT
、HAVING
混淆,或者搞不懂“分组后到底还能选哪些字段”。
本篇将从 0 到 1 全面讲解 GROUP BY
的原理、语法、实际案例、注意事项和面试回答,让你真正掌握它的应用场景!
🧠 一、什么是 GROUP BY?
GROUP BY
是一个分组语句,用于将结果集按照一个或多个字段进行分组,并常与聚合函数(如 COUNT()
、SUM()
、AVG()
、MAX()
、MIN()
)一起使用,对每个组分别进行统计。
🧱 二、GROUP BY 的基本语法
SELECT column1, AGG_FUNC(column2)
FROM table_name
GROUP BY column1;
column1
:分组依据;AGG_FUNC(column2)
:对分组后的每组数据应用聚合函数。
🧪 三、实战案例讲解
示例表:sales
id | product | quantity | price |
---|---|---|---|
1 | A | 2 | 10 |
2 | B | 1 | 15 |
3 | A | 3 | 10 |
4 | B | 2 | 15 |
5 | C | 5 | 20 |
1. 按产品统计销售总量
SELECT product, SUM(quantity) AS total_sold
FROM sales
GROUP BY product;
🔍 结果:
product | total_sold |
---|---|
A | 5 |
B | 3 |
C | 5 |
2. 按产品统计总销售额(单价 × 数量)
SELECT product, SUM(quantity * price) AS total_income
FROM sales
GROUP BY product;
🔍 结果:
product | total_income |
---|---|
A | 50 |
B | 45 |
C | 100 |
❗ 四、使用 GROUP BY 的注意事项
1. SELECT 中出现的字段要么在 GROUP BY 中,要么是聚合函数
错误写法:
SELECT id, product, SUM(quantity) FROM sales GROUP BY product;
-- ❌ 错误:id 不是分组字段,也没有聚合,SQL 报错
正确做法是:只保留
GROUP BY
字段或聚合结果。
2. 支持多字段分组(组合分组)
SELECT product, price, SUM(quantity)
FROM sales
GROUP BY product, price;
这会对
(product, price)
的组合进行分组,比如同一产品不同价格也会被拆开统计。
3. 可搭配 HAVING 对分组结果进行过滤
SELECT product, SUM(quantity) AS total
FROM sales
GROUP BY product
HAVING total > 4;
只显示销量大于 4 的产品。
🎯 五、GROUP BY 和 DISTINCT 的区别
功能 | GROUP BY | DISTINCT |
---|---|---|
去重作用 | ✅(间接去重) | ✅ |
是否支持聚合函数 | ✅ | ❌ 不能直接聚合 |
使用目的 | 分组统计/聚合分析 | 去除重复值 |
可读性 | 稍复杂 | 简单 |
举例:
-- 查询所有不同产品名称
SELECT DISTINCT product FROM sales;-- 查询每种产品的销售总量
SELECT product, SUM(quantity) FROM sales GROUP BY product;
🔧 六、经典进阶用法
1. 子查询中使用 GROUP BY
查询销售额最高的产品:
SELECT product, SUM(quantity * price) AS income
FROM sales
GROUP BY product
ORDER BY income DESC
LIMIT 1;
2. 使用 COUNT(DISTINCT xxx)
-- 查询每个产品有多少个不同订单ID
SELECT product, COUNT(DISTINCT id) AS order_count
FROM sales
GROUP BY product;
🧑💼 七、面试问答必备总结
❓Q1:GROUP BY 和 HAVING 有什么区别?
A:
GROUP BY
是分组;HAVING
是对分组后的结果进行筛选;HAVING
一般与聚合函数一起使用,而WHERE
是分组之前的筛选条件。
❓Q2:GROUP BY 一定要配合聚合函数吗?
A:
- 不一定。但如果不使用聚合函数,它的作用类似于
DISTINCT
。
SELECT product FROM sales GROUP BY product;
-- 相当于 SELECT DISTINCT product FROM sales;
❓Q3:GROUP BY 后 SELECT 中的字段必须出现在 GROUP BY 中吗?
A:
- 是的(除非是聚合函数),否则 SQL 报错;
- 某些数据库可能“宽容”允许不完全匹配,但不推荐这么写。
✅ 八、总结:GROUP BY 是数据统计的核心工具
能力 | 是否支持 |
---|---|
按字段组合分组 | ✅ |
配合聚合函数统计 | ✅ |
配合 HAVING 筛选 | ✅ |
多字段组合分组 | ✅ |
替代 DISTINCT 去重 | ✅(功能上) |
练习:点击进入
力扣上这道题目可以很好的锻炼到group by
的用法
非聚合列一定包含在group by子句之中
📘 后续推荐学习:
- ✔️ HAVING 详解 + 实战应用(上一篇)
- ✔️ JOIN 多表查询详解
- ✔️ 子查询与派生表的使用方式
- ✔️ 窗口函数 OVER() 详解:分组与不分组的完美结合
如果你喜欢这样的 SQL 系列讲解,我可以继续推出《JOIN 的核心原理与实战》、《窗口函数 OVER() 的全解析》 等内容。欢迎点赞、评论或继续提问你感兴趣的 SQL 技术点!