首页 >> 综合 > 常识问答 >

问sql 中的 groupby 语句的作用 分组聚合详解

2026-11-12 16:48:36

答

sql 中的 group by 语句核心作用就是把数据表里面相同分组字段的数据合并成一组,然后配合聚合函数对每一组单独做统计计算,常见聚合函数包含 count sum avg max min,简单理解就是把一堆明细数据按照指定类别归类,每组只输出一行汇总结果,比如按部门统计总工资,按月份统计订单数量,按商品类别统计销售额,都是 group by 最典型的应用场景,group by 属于 DQL 查询里面非常核心的子句,它一般写在 where 后面,order by 前面,很多新手写 SQL 的时候容易混淆 where 和 having,where 是分组之前过滤原始数据,having 是分组完成之后对分组结果做二次过滤,MySQL5.7 之后开启严格模式,要求 select 后面非聚合字段必须全部写在 group by 里面,否则会直接报错,这个是高频踩坑点,group by 本身不改变原始表数据,只是查询的时候临时分组,不会修改库里原有记录,它经常和多表 join 联合使用,做跨表分组统计,同时分组查询很容易产生临时表和文件排序,数据量大的时候会拖慢查询速度,写 SQL 的时候需要考虑索引优化,让分组字段命中索引减少性能消耗。

group by 执行顺序

数据库执行 select 语句的时候,执行顺序是 from 确定数据表,where 过滤原始行,group by 执行分组,聚合函数计算每组结果,having 过滤分组之后的结果,order by 排序,最后 limit 截取分页,理解这个执行顺序,就能明白为什么 where 不能写聚合函数条件,因为 where 执行的时候分组还没有完成,聚合结果还没有生成。

常用聚合函数搭配表格

聚合函数功能
count统计每组记录条数
sum计算每组数值总和
avg计算每组数值平均值
max取出每组最大值
min取出每组最小值

基础语法与实操示例

基础语法

select 分组字段 聚合函数 from 表名 where 条件 group by 分组字段 having 分组后过滤条件 order by 排序字段

示例 按部门分组统计员工人数

select dept_id count from employee group by dept_id

示例 分组之后过滤,只保留员工数量大于 5 的部门

select dept_id count from employee group by dept_id having count > 5

group by 和 where having 区别

where 在分组之前筛选原始明细数据,不能使用聚合函数

having 在分组之后筛选分组汇总结果,可以使用聚合函数

如果同时需要原始数据过滤和分组后过滤,就可以 where 和 having 一起写

多字段分组

group by 后面可以写多个分组字段,代表组合分组,也就是字段全部相同才归为同一组,比如同时按地区和商品类别分组,统计每个地区每个品类的销售额,适合二维统计报表场景。

性能相关要点

当表数据量很大,group by 分组的时候,如果分组字段没有索引,数据库需要全表扫描之后排序分组,产生 Using temporary 和 Using filesort,查询性能会明显下降,优化思路就是给 group by 对应的字段建立合适索引,让数据库利用索引有序性,跳过额外排序分组步骤,提升查询速度。

常见错误写法

select name dept_id count from employee group by dept_id,这种写法在严格模式会报错,因为 select 里面的 name 没有放到 group by 后面,数据库无法确定这一组里面要取哪一条 name 的值。

还有新手把聚合条件写进 where,比如 where count>5,执行会直接报错,聚合筛选条件必须放到 having 里面。

【常见问题】

问题 1 sql 中的 groupby 语句的作用,having 能不能替代 where

回答 1 sql 中的 groupby 语句的作用是分组统计,having 不能替代 where,where 是分组前过滤原始数据,having 是分组之后过滤聚合结果,sql 中的 groupby 语句的作用对应的筛选逻辑两者阶段不一样。

问题 2 sql 中的 groupby 语句的作用,select 后面字段为什么必须写进 groupby

回答 2 sql 中的 groupby 语句的作用是把多行合并成一组,一组里面有多条原始记录,非聚合字段如果不写进 groupby,数据库无法确定取值,MySQL 严格模式就会报错,sql 中的 groupby 语句的作用就是保证分组查询字段规则合规。

问题 3 sql 中的 groupby 语句的作用,可以同时按多个字段分组吗

回答 3 sql 中的 groupby 语句的作用支持多字段组合分组,groupby 后面填写多个字段,全部字段值相同的数据归成一组,sql 中的 groupby 语句的作用适合多维统计报表场景。

问题 4 sql 中的 groupby 语句的作用,分组查询慢是什么原因

回答 4 sql 中的 groupby 语句的作用是分组聚合,分组查询慢大多是分组字段没有索引,全表扫描之后产生临时表和文件排序,sql 中的 groupby 语句的作用对应的优化方式就是给分组字段建立索引。

【免责申明】

本内容为 SQL group by 通用语法讲解,不同数据库比如 Oracle SQLServer 在分组严格校验规则上存在细微差异,内容仅用于学习参考,生产 SQL 编写请结合数据库版本特性。

 

相关阅读

最新文章
站长推荐