SQL分组Group By

一、先搞懂:分组查询是干嘛的?

分组查询 GROUP BY 就是把表中数据按照某个字段「分类」,然后对每一类做统计 。比如你 emp 表有 gender(性别)字段,用分组就能:

  • 统计「男员工有多少人、女员工有多少人」
  • 统计「每个地址的平均年龄」
  • 统计「每个入职年份的人数」

二、标准语法(和你图里完全一致)

复制代码
SELECT 字段列表 
FROM 表名 
[WHERE 分组前过滤条件] 
GROUP BY 分组字段名 
[HAVING 分组后过滤条件];

语法拆解(对应你 emp 表)

部分 作用 例子
SELECT 字段列表 要查询的内容,只能写「分组字段」或「聚合函数」 gender, COUNT(*), AVG(age)
FROM 表名 从哪个表查 FROM emp
WHERE 条件 分组前,先筛掉不符合条件的数据,不参与分组 WHERE age > 18(只统计 18 岁以上的)
GROUP BY 分组字段 按哪个字段分组 GROUP BY gender(按性别分组)
HAVING 条件 分组后,对统计结果再过滤 HAVING COUNT(*) > 10(只保留人数 > 10 的分组)

三、执行顺序:where > 聚合函数 > having

正确的完整核心顺序应该是:

FROM → WHERE → GROUP BY → HAVING (含聚合计算) → SELECT → ORDER BY → LIMIT

标准的 SQL 逻辑执行顺序如下:

  1. FROM / JOIN :确定要查询的数据表,并处理表之间的连接操作(包括 ON 条件)。

  2. WHERE :对 FROM 阶段产生的数据行进行逐行过滤。

  3. GROUP BY :将经过 WHERE 过滤后的数据按照指定的列进行分组。

  4. HAVING :对分组后的数据进行条件过滤。(注意:聚合函数通常是在这一步以及下一步真正开始计算的,因为必须先分组才能计算每组的聚合值)。

  5. SELECT:提取所需的列,计算最终的表达式,并赋予别名。

  6. DISTINCT:对结果集去重(如果查询中包含了该关键字)。

  7. ORDER BY :对最终的输出结果进行排序。此时可以使用 SELECT 阶段产生的字段别名。

  8. LIMIT / OFFSET:限制最终返回给客户端的行数,或者进行分页。

为什么 HAVINGSELECT 之前?

HAVING 的作用是过滤分组 (Group)。在数据库处理逻辑中,必须先对分好的组进行筛选,决定保留哪些组,然后再把这些保留下来的组的数据传递给 SELECT 去提取最终需要的列。

如果 HAVINGSELECT 之后执行,就意味着数据库要把所有组的数据都提取出来,然后再丢弃不符合条件的组,这在逻辑上和性能上都是不合理的。

1. DISTINCT:去重关键字

  • 作用 :对查询结果的指定字段去重,去掉重复的行,只保留唯一值。
  • 适用数据库所有主流数据库通用(MySQL、Oracle、SQL Server、PostgreSQL 等)
  • 核心位置必须紧跟在 SELECT 后面,放在字段列表的最前面。

2. TOP:分页 / 取前 N 条关键字

  • 作用 :从查询结果中取前 N 条记录,实现分页 / 限制返回行数。
  • 适用数据库仅 SQL Server / Access 支持MySQL 不支持 (MySQL 用 LIMIT,Oracle 用 ROWNUM
  • 核心位置紧跟在 SELECT 后面,放在字段列表的最前面。

1. 位置铁律

  • DISTINCT必须紧跟 SELECT 之后,字段列表之前,全数据库通用。
  • TOP必须紧跟 SELECT 之后,字段列表之前,仅 SQL Server 支持。
  • 同时使用SELECT TOP N DISTINCT(TOP 在前,DISTINCT 在后)。

2. 核心区别

表格

关键字 作用 适用数据库 核心位置
DISTINCT 去重 全数据库通用 SELECT 后,字段前
TOP 取前 N 条 仅 SQL Server SELECT 后,字段前
相关推荐
计算机安禾7 分钟前
【数据库系统原理】第15篇:范式理论(上):1NF至BCNF——消除非主属性对码的传递依赖与部分依赖
数据库
你的保护色24 分钟前
数据库第一章-基础知识学习
数据库·学习
倔强的石头_28 分钟前
《Kingbase护城河》——数据库卡顿急救手册:会话状态深度解析与“僵尸进程”排查实战
数据库
ManageEngine卓豪1 小时前
数据库可观测性:MySQL与Redis监控核心监控指标与全栈运维解决方案
数据库·redis·mysql·数据库性能·数据库监控
真实的菜1 小时前
Redis 从入门到精通(十四):Redis 7.x 新特性全解 —— 系列收官之作
数据库·redis·缓存
哭哭啼1 小时前
pgSql 事务篇
java·数据库·postgresql
霸道流氓气质1 小时前
从MySQL到云原生:全面解析阿里云PolarDB数据库及其与MySQL的核心差异
数据库·mysql·云原生
这个DBA有点耶2 小时前
时序数据库选型:吞吐、压缩与查询延迟的均衡之术
数据库·sql·架构·时序数据库·dba
luck_bor2 小时前
数据库简介
数据库·oracle