MySQL 分组查询:GROUP BY 语句


一则或许对你有用的小广告

欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书

  • 《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于 Spring AI + Spring Boot 3.x + JDK 21...查看介绍

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...查看介绍;演示链接:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/

  • 新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍

截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观

在 MySQL 中,GROUP BY 语句用于将查询结果中的行按指定列分组,并对每个分组进行聚合操作。 GROUP BY 经常与聚合函数(如 COUNTSUMAVG 等)一起使用,用于计数、求和、求平均值,或其他分组计算。

1. 基本语法

GROUP BY 的基本语法如下:

SELECT1, 聚合函数(2)
FROM 表名
WHERE 条件
GROUP BY1;
  • 列1:需要分组的字段。
  • 聚合函数(列2):对每个分组应用的聚合函数,如 COUNTSUMAVG 等。
  • 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_idprice 分组:

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_idprice 组合相同的记录合并到一个组中,并计算每组的 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 则可以快速生成小计行。合理运用这些功能可以使查询更加高效、灵活。