【MySQL 从 0 讲解系列】深入理解 GROUP BY 的本质与应用(含SQL示例+面试题)


🔍【MySQL 从 0 讲解系列】深入理解 GROUP BY 的本质与应用(含SQL示例+面试题)

GROUP BY 是 SQL 查询中最常见也最核心的语法之一,尤其在进行数据统计分析 时不可或缺。然而,很多初学者对它理解不深,经常和 DISTINCTHAVING 混淆,或者搞不懂"分组后到底还能选哪些字段"。

本篇将从 0 到 1 全面讲解 GROUP BY原理、语法、实际案例、注意事项和面试回答,让你真正掌握它的应用场景!


🧠 一、什么是 GROUP BY?

GROUP BY 是一个分组语句 ,用于将结果集按照一个或多个字段进行分组,并常与聚合函数 (如 COUNT()SUM()AVG()MAX()MIN())一起使用,对每个组分别进行统计。


🧱 二、GROUP BY 的基本语法

sql 复制代码
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. 按产品统计销售总量

sql 复制代码
SELECT product, SUM(quantity) AS total_sold
FROM sales
GROUP BY product;

🔍 结果:

product total_sold
A 5
B 3
C 5

2. 按产品统计总销售额(单价 × 数量)

sql 复制代码
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 中,要么是聚合函数

错误写法:

sql 复制代码
SELECT id, product, SUM(quantity) FROM sales GROUP BY product;
-- ❌ 错误:id 不是分组字段,也没有聚合,SQL 报错

正确做法是:只保留 GROUP BY 字段或聚合结果。


2. 支持多字段分组(组合分组)

sql 复制代码
SELECT product, price, SUM(quantity)
FROM sales
GROUP BY product, price;

这会对 (product, price)组合进行分组,比如同一产品不同价格也会被拆开统计。


3. 可搭配 HAVING 对分组结果进行过滤

sql 复制代码
SELECT product, SUM(quantity) AS total
FROM sales
GROUP BY product
HAVING total > 4;

只显示销量大于 4 的产品。


🎯 五、GROUP BY 和 DISTINCT 的区别

功能 GROUP BY DISTINCT
去重作用 ✅(间接去重)
是否支持聚合函数 ❌ 不能直接聚合
使用目的 分组统计/聚合分析 去除重复值
可读性 稍复杂 简单

举例:

sql 复制代码
-- 查询所有不同产品名称
SELECT DISTINCT product FROM sales;

-- 查询每种产品的销售总量
SELECT product, SUM(quantity) FROM sales GROUP BY product;

🔧 六、经典进阶用法

1. 子查询中使用 GROUP BY

查询销售额最高的产品:

sql 复制代码
SELECT product, SUM(quantity * price) AS income
FROM sales
GROUP BY product
ORDER BY income DESC
LIMIT 1;

2. 使用 COUNT(DISTINCT xxx)

sql 复制代码
-- 查询每个产品有多少个不同订单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
sql 复制代码
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 详解 + 实战应用(上一篇)](#✔️ HAVING 详解 + 实战应用(上一篇))
  • [✔️ JOIN 多表查询详解](#✔️ JOIN 多表查询详解)
  • [✔️ 子查询与派生表的使用方式](#✔️ 子查询与派生表的使用方式)
  • [✔️ 窗口函数 OVER() 详解:分组与不分组的完美结合](#✔️ 窗口函数 OVER() 详解:分组与不分组的完美结合)

如果你喜欢这样的 SQL 系列讲解,我可以继续推出《JOIN 的核心原理与实战》、《窗口函数 OVER() 的全解析》 等内容。欢迎点赞、评论或继续提问你感兴趣的 SQL 技术点!

相关推荐
仍然.5 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐5 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99995 小时前
Redis-0-业务逻辑
数据库·redis·缓存
证榜样呀5 小时前
2026 中专大数据技术专业可考的证书有哪些,必看!
大数据·sql
Codefengfeng5 小时前
数据安全知识点速通
sql
自不量力的A同学5 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.5 小时前
Mysql
数据库·mysql
全栈前端老曹6 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8636 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道6 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议