“动动小手,点点关注呗~”👇
做业务报表、数据统计、后台列表开发时,GROUP BY、HAVING、ORDER BY、LIMIT几乎是必用组合,很多人分不清WHERE和HAVING的边界、搞不懂分组统计怎么写、分页越往后越卡顿。
今天从使用场景、语法、分组函数、过滤规则到排序分页细节,完整拆解这套高频查询能力!
一、GROUP BY 分组查询:到底什么场景必须用它?
适用场景
当你需要按某个 / 某几个维度做分类聚合统计时,就一定要用GROUP BY,举几个日常例子:
•按「部门」分组,统计每个部门的员工人数、平均薪资
•按「商品品类」分组,统计每个品类的销售总额、商品上架数量
•按「日期」分组,统计每日订单成交笔数、营收金额简单说:把相同特征的数据归为一组,对每组做求和、计数、求平均这类批量计算,就是分组查询的核心价值。
标准语法结构
完整书写顺序要贴合 MySQL 执行逻辑:

⚠️ 规范要求:SELECT后出现的非聚合普通字段,必须写在GROUP BY后面,否则会出现统计结果错乱的问题。
核心配套:常用分组(聚合)函数
分组只有搭配聚合函数才有统计意义,高频函数一览:
函数 | 作用 | 示例 |
COUNT() | 统计分组内行数 | COUNT(id)统计每组商品数量 |
SUM() | 计算分组字段总和 | SUM(sale_amount)统计每组总销售额 |
AVG() | 计算分组字段平均值 | AVG(price)统计每组商品均价 |
MAX() | 取分组内最大值 | MAX(price)找出每组最贵商品 |
MIN() | 取分组内最小值 | MIN(price)找出每组最便宜商品 |
演示表product数据:
id | name | category | price | sale_amount | create_time |
1 | 蓝牙耳机 | 数码 | 199 | 5000 | 2025-01 |
2 | 机械键盘 | 数码 | 299 | 8200 | 2025-01 |
3 | 陶瓷水杯 | 家居 | 39 | 2300 | 2025-01 |
4 | 收纳架 | 家居 | 79 | 3600 | 2025-01 |
基础分组示例:统计每个品类的商品数量、总销售额 |

执行结果:
category | goods_num | total_sale |
数码 | 2 | 13200 |
家居 | 2 | 5900 |
二、HAVING 分组后过滤:和 WHERE 的核心区别 + 实战
核心定位
WHERE是分组之前筛选原始行数据,不能用聚合函数;HAVING是分组统计完成之后,对聚合后的结果做二次筛选,支持聚合函数,这是二者最关键的差异。
承接上面的案例,我们筛选「总销售额大于 10000 的品类」:

最终只会返回数码品类这条数据。
WHERE 和 HAVING 对比表
对比项 | WHERE | HAVING |
执行时机 | 分组统计前,过滤原始数据 | 分组统计后,过滤分组结果 |
能否用聚合函数 | 不支持 | 支持 |
适用场景 | 按单条行的属性筛选(比如单价 > 50) | 按分组统计结果筛选(比如总销量 > 1000) |
三、ORDER BY 排序查询:让结果按你的规则排列
基础用法
ORDER BY用来对最终查询结果做排序,支持升序ASC(默认可省略)、降序DESC,支持单字段、多字段排序。
1.单字段排序:按商品单价从高到低排列

2.多字段排序:先按品类排序,同品类内按销售额降序

小技巧:可以直接使用SELECT里定义的别名排序,可读性更强:

四、LIMIT 分页查询:后台列表必备写法 + 性能优化
基础语法
LIMIT 偏移量, 每页条数
•偏移量:跳过前面多少行数据,第一页偏移量为 0
•通用分页公式:LIMIT (页码-1)*每页条数, 每页条数
示例:每页展示 2 条数据,查询第 2 页内容

海量数据避坑优化
当偏移量非常大时(比如LIMIT 100000,10),MySQL 会先扫描前面 10 万条数据再丢弃,性能极差。优化方案:用主键范围分页替代大偏移量:

五、四者综合实战完整案例
需求:统计 2025 年上架的各品类商品总销售额,只保留总销售额≥6000 的品类,按销售额降序排列,只取排名第一的品类

六、新手高频踩坑合集
1.GROUP BY 后乱写字段:SELECT里非聚合字段必须出现在GROUP BY 中,不然统计结果不可控;
2.在 WHERE 里写聚合函数:WHERE SUM(sale)>5000会直接报错,聚合过滤要放到 HAVING;
3.大偏移量直接用 LIMIT 分页:数据量越大越卡顿,优先用主键游标优化;
4.排序和分组顺序颠倒:先分组过滤,最后再排序分页,不要提前排序浪费性能。
七、全文总结
1.GROUP BY:用于分类聚合统计,搭配COUNT/SUM 等分组函数实现多维度报表;
2.HAVING:专门过滤分组后的统计结果,支持聚合函数,和WHERE 分工明确;
3.ORDER BY:调整最终结果展示顺序,支持多字段复杂排序;
4.LIMIT:实现分页截取,海量数据场景要做优化避免性能瓶颈;四个子句按「WHERE→GROUP BY→HAVING→ORDER BY→LIMIT」的执行顺序运作,理清顺序就能写出绝大多数统计类查询。
干货福利
评论区回复「分组查询」,领取电商、人事场景可直接复制的分组统计 + 分页模板!
要不要我再补充一份 MySQL 严格模式下 GROUP BY 报错的解决方法清单?
“动动小手,点点关注呗~”🫰
夜雨聆风