MySQL 分组查询:GROUP BY 语句
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观
在 MySQL 中,GROUP BY
语句用于将查询结果中的行按指定列分组,并对每个分组进行聚合操作。 GROUP BY
经常与聚合函数(如 COUNT
、SUM
、AVG
等)一起使用,用于计数、求和、求平均值,或其他分组计算。
1. 基本语法
GROUP BY
的基本语法如下:
SELECT 列1, 聚合函数(列2)
FROM 表名
WHERE 条件
GROUP BY 列1;
- 列1:需要分组的字段。
- 聚合函数(列2):对每个分组应用的聚合函数,如
COUNT
、SUM
、AVG
等。 - GROUP BY:指定按哪一个或多个列分组。
2. 使用 GROUP BY 进行分组统计
假设有一个名为 t_sale
的销售表,包含以下字段:
sale_id(主键) | product_id(产品ID) | quantity(数量) | price(价格) |
---|---|---|---|
1 | A | 2 | 100 |
2 | B | 1 | 150 |
3 | A | 3 | 100 |
4 | C | 1 | 200 |
5 | B | 2 | 150 |
我们希望按 product_id
分组,并计算每种产品的总销量:
SELECT product_id, SUM(quantity) AS total_quantity
FROM t_sale
GROUP BY product_id;
查询结果:
product_id | total_quantity |
---|---|
A | 5 |
B | 3 |
C | 1 |
此语句将 product_id
相同的记录合并到一个组中,并计算每种产品的 quantity
总和。
3. 使用 GROUP BY 和多个聚合函数
可以在 GROUP BY
中使用多个聚合函数。假设我们希望按产品计算销量和销售总额:
SELECT product_id, SUM(quantity) AS total_quantity, SUM(quantity * price) AS total_t_sale
FROM t_sale
GROUP BY product_id;
查询结果:
product_id | total_quantity | total_t_sale |
---|---|---|
A | 5 | 500 |
B | 3 | 450 |
C | 1 | 200 |
在这里,SUM(quantity * price)
计算了每种产品的销售总额。
4. 使用 GROUP BY 多列分组
GROUP BY
可以使用多个列组合分组。在这种情况下,数据会按多个列的组合值进行分组。例如,按 product_id
和 price
分组:
SELECT product_id, price, SUM(quantity) AS total_quantity
FROM t_sale
GROUP BY product_id, price;
查询结果:
product_id | price | total_quantity |
---|---|---|
A | 100 | 5 |
B | 150 | 3 |
C | 200 | 1 |
此语句将 product_id
和 price
组合相同的记录合并到一个组中,并计算每组的 quantity
总和。
5. 使用 GROUP BY 和 HAVING 筛选分组结果
HAVING
子句用于筛选分组后的结果。假设我们只想查看销量超过 3 的产品:
SELECT product_id, SUM(quantity) AS total_quantity
FROM t_sale
GROUP BY product_id
HAVING total_quantity > 3;
查询结果:
product_id | total_quantity |
---|---|
A | 5 |
此语句首先按 product_id
分组,计算 quantity
的总和,然后筛选出 total_quantity
大于 3 的分组。
6. GROUP BY 和 ORDER BY 的配合使用
在分组后,可以使用 ORDER BY
对结果进行排序。例如,按销量从高到低排序:
SELECT product_id, SUM(quantity) AS total_quantity
FROM t_sale
GROUP BY product_id
ORDER BY total_quantity DESC;
查询结果按 total_quantity
降序排列。
7. GROUP BY 和 WITH ROLLUP 用于小计
WITH ROLLUP
选项可以用于在结果中添加小计行。假设我们希望在结果中添加一个总销量的行:
SELECT product_id, SUM(quantity) AS total_quantity
FROM t_sale
GROUP BY product_id WITH ROLLUP;
查询结果:
product_id | total_quantity |
---|---|
A | 5 |
B | 3 |
C | 1 |
NULL | 9 |
在这里,NULL
表示所有 product_id
的总和。
8. 小结
GROUP BY
是 MySQL 中进行分组和数据统计的强大工具,结合 HAVING
可以实现分组筛选,配合 ORDER BY
可以控制排序,使用 WITH ROLLUP
则可以快速生成小计行。合理运用这些功能可以使查询更加高效、灵活。