在实际的数据分析中,我们经常需要对数据进行分类汇总,比如:
- 每个用户的订单总金额是多少?
- 每个产品的销售数量是多少?
- 每个月的销售额趋势如何?
这时候就需要用到 SQL 中非常实用的关键字 —— GROUP BY。
一、 什么是 GROUP BY?
GROUP BY 的作用是将查询结果按照一个或多个字段进行“分组”,然后对每个组内的数据进行聚合操作(如求和、计数、平均值等)。
你可以把它理解为:“把相同类型的数据归类在一起,再做统计”。
二、 基本语法
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;
column1:用于分组的字段。aggregate_function:聚合函数,如SUM()、COUNT()、AVG()、MAX()、MIN()等。
三、示例讲解
假设我们有一个 orders 表,记录了每个用户下的订单信息:
表:orders
| order_id | user_id | product | amount |
|---|---|---|---|
| 1 | 1 | 手机 | 2999 |
| 2 | 1 | 耳机 | 499 |
| 3 | 2 | 鼠标 | 199 |
| 4 | 2 | 键盘 | 399 |
| 5 | 3 | 显示器 | 899 |
示例1:按用户分组,计算每个用户的订单总金额
SELECT user_id, SUM(amount) AS total_amount
FROM orders
GROUP BY user_id;
结果:
| user_id | total_amount |
|---|---|
| 1 | 3498 |
| 2 | 598 |
| 3 | 899 |
这里使用了 SUM() 函数来计算每个用户的订单总金额。
示例2:按用户分组,统计每个用户的订单数量
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;
结果:
| user_id | order_count |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 3 | 1 |
使用 COUNT(*) 统计每个用户下了多少个订单。
示例3:结合 WHERE 条件 + 多字段分组
-- 查询每个用户购买每种商品的数量
SELECT user_id, product, COUNT(*) AS count
FROM orders
GROUP BY user_id, product;
结果:
| user_id | product | count |
|---|---|---|
| 1 | 手机 | 1 |
| 1 | 耳机 | 1 |
| 2 | 鼠标 | 1 |
| 2 | 键盘 | 1 |
| 3 | 显示器 | 1 |
这里通过两个字段(user_id 和 product)来进行分组,更细粒度地统计数据。
注意:
-
GROUP BY后面必须列出所有非聚合列。也就是说,在SELECT中出现的列,如果不是聚合函数的结果,就必须出现在GROUP BY中。错误示例:
SELECT user_id, product, COUNT(*) FROM orders GROUP BY user_id; -- product 没有出现在 GROUP BY 中,会报错 -
可以结合
HAVING对分组后的结果进行筛选,例如只显示总金额大于1000的用户:SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id HAVING total > 1000;
四、总结对比表
| 功能 | 示例语句 |
|---|---|
| 分组求和 | SELECT user_id, SUM(amount) |
| 分组计数 | SELECT user_id, COUNT(*) |
| 多字段分组 | GROUP BY user_id, product |
| 分组后筛选 | HAVING SUM(amount) > 1000 |
| 常见聚合函数 | SUM(), COUNT(), AVG(), MAX(), MIN() |
如果这篇文章对大家有帮助可以点赞关注,你的支持就是我的动力😊!