MySQL分组查询详解:GROUP BY实战与聚合技巧

南乔
南乔
发布时间:2026-10-13 | 4人浏览过
原创

在MySQL数据库查询中,当需要对数据进行分类统计时,普通的聚合函数无法满足需求。本文详细介绍如何使用 GROUP BY 实现分组查询,包括多级分组规则、SELECT子句的配合限制、WITH ROLLUP 的汇总功能以及 GROUP_CONCAT 字符串合并技巧,帮助解决部门统计、职位汇总等实际场景中的数据处理问题。

分组查询的基础逻辑

聚合函数(如 SUM、AVG、COUNT)默认对全表数据进行统计,即使配合 WHERE 子句缩小范围,也无法实现“按类别”分别统计的目标。例如,计算每个部门的平均底薪,就需要将数据按照部门编号进行划分,再对每个组内的数据进行汇总处理。

MySQL 通过 GROUP BY 子句实现这一功能,它可以将数据集划分为若干个小的区域,针对每个小区域独立执行汇总计算。

第1步:基础单列分组

目的:获取每个部门的平均薪资。
入口:使用 SELECT 选择分组字段和聚合函数。
动作:指定 GROUP BY 后的字段作为分组依据。

SELECT deptno, AVG(sal) 
FROM t_emp
GROUP BY deptno;

上述代码将 t_emp 表按 deptno(部门编号)分组,并计算各组的 sal(薪资)平均值。若希望结果更简洁,可以使用 ROUND() 函数去除小数:

SELECT deptno, ROUND(AVG(sal))
FROM t_emp
GROUP BY deptno;

逐级分组(多列分组)

当需求进一步细化,需要在大的分组内部再进行细分时(例如:先按部门分,再按职位分),可以使用多列分组条件。MySQL 支持在 GROUP BY 后列出多个字段,执行时会依次对这些列进行分组。

第2步:多列分组与排序

目的:查询每个部门中,每种职位的人数和平均月薪。
入口:在 SELECT 和 GROUP BY 中包含多个字段。
参数:GRO U P BY deptno, job。

SELECT deptno, job, COUNT(*), AVG(sal)
FROM t_emp
GROUP BY deptno, job
ORDER BY deptno;

该语句首先按部门分组,然后在每个部门内按职位二次分组,最后通过 ORDER BY 确保结果按部门编号排序输出。

SELECT子句的分组规范

在使用 GROUP BY 时,SELECT 子句的内容受到严格限制,这是初学者常见的报错点:

  • 允许内容:参与分组的字段(即 GROUP BY 中指定的列)、聚合函数(如 COUNT(*))、常量。
  • 禁止内容:未参与分组且未被聚合函数包裹的非分组字段。

合规示例:

SELECT deptno, COUNT(*), AVG(sal)
FROM t_emp
GROUP BY deptno;

违规示例及原理分析:

SELECT deptno, COUNT(*), AVG(sal), sal
FROM t_emp
GROUP BY deptno;

错误原因:在上述 SQL 中,deptno、COUNT(*) 和 AVG(sal) 返回的是分组后的单行聚合结果,而单独的 sal 字段对应的是多条原始记录。两者的行数不匹配,导致 MySQL 无法直接拼接,因此会抛出语法错误或结果异常。标准 SQL 规定,聚合查询时必须遵守此规范。

第3步:分组结果的再次汇总

如果需要在分组统计的基础上,再对整个结果集进行一次汇总(例如计算所有部门的总人数和总体平均工资),可以使用 WITH ROLLUP 关键字。

SELECT deptno, COUNT(*), AVG(sal), MAX(sal), MIN(sal)
FROM t_emp
GROUP BY deptno
WITH ROLLUP;

执行后,结果集的最后一行会自动生成一组汇总数据,对应各个聚合函数的总计值。

非分组字段的合并:GROUP_CONCAT

有时我们需要在分组的同时,查看组内包含的所有成员姓名(非分组字段)。由于不能直接在 SELECT 中列出普通字段,MySQL 提供了 GROUP_CONCAT 函数,将分组内的多条记录合并为一个字符串。

第4步:使用GROUP_CONCAT提取组内明细

目的:查询月薪大于等于 2000 元的员工所在部门、人员名单及平均薪资。
动作:使用 GROUP_CONCAT(ename) 合并姓名。

SELECT deptno, GROUP_CONCAT(ename), AVG(sal), COUNT(*)
FROM t_emp
WHERE sal >= 2000
GROUP BY deptno;

通过此函数,原本无法在聚合查询中显示的多条 ename 记录被转换为逗号分隔的单行文本,成功解决了非分组字段无法在 SELECT 中出现的限制。

SQL子句的执行顺序

理解分组查询的执行逻辑有助于编写正确的 SQL。截止到目前,涉及的主要子句执行顺序如下:

  1. FROM:确定数据源表。
  2. WHERE:过滤行数据(在分组前执行)。
  3. GROUP BY:进行数据分组。
  4. SELECT:选择显示的列和聚合结果。
  5. ORDER BY:对结果排序。
  6. LIMIT:限制返回行数。

掌握这一顺序能有效避免在 WHERE 中使用聚合函数或在 SELECT 中使用别名导致的常见错误。

以上就是MySQL分组查询详细用法的详细内容,更多关于MySQL分组查询技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表