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 经常与聚合函数(如 COUNTSUMAVG 等)一起使用,用于计数、求和、求平均值,或其他分组计算。

1. 基本语法

GROUP BY 的基本语法如下:

SELECT 列1, 聚合函数(列2)
FROM 表名
WHERE 条件
GROUP BY 列1;
  • 列1:需要分组的字段。
  • 聚合函数(列2):对每个分组应用的聚合函数,如 COUNTSUMAVG 等。
  • GROUP BY:指定按哪一个或多个列分组。

2. 使用 GROUP BY 进行分组统计

假设有一个名为 t_sale 的销售表,包含以下字段:

sale_id(主键)product_id(产品ID)quantity(数量)price(价格)
1A2100
2B1150
3A3100
4C1200
5B2150

我们希望按 product_id 分组,并计算每种产品的总销量:

SELECT product_id, SUM(quantity) AS total_quantity
FROM t_sale
GROUP BY product_id;

查询结果:

product_idtotal_quantity
A5
B3
C1

此语句将 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_idtotal_quantitytotal_t_sale
A5500
B3450
C1200

在这里,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_idpricetotal_quantity
A1005
B1503
C2001

此语句将 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_idtotal_quantity
A5

此语句首先按 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_idtotal_quantity
A5
B3
C1
NULL9

在这里,NULL 表示所有 product_id 的总和。

8. 小结

GROUP BY 是 MySQL 中进行分组和数据统计的强大工具,结合 HAVING 可以实现分组筛选,配合 ORDER BY 可以控制排序,使用 WITH ROLLUP 则可以快速生成小计行。合理运用这些功能可以使查询更加高效、灵活。