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 后,字段前
相关推荐
2301_766283449 分钟前
Golang怎么实现防重复提交_Golang如何用Token机制防止表单重复提交【技巧】
jvm·数据库·python
qq_414256579 分钟前
CSS如何实现元素在容器内居中_利用margin-auto技巧
jvm·数据库·python
2401_8242226910 分钟前
如何用 Transferable 对象零拷贝转移超大数组内存给子线程
jvm·数据库·python
SilentSamsara11 分钟前
Python 并发基础:threading/GIL 与 multiprocessing 的选型逻辑
服务器·开发语言·数据库·vscode·python·pycharm
m0_4954964111 分钟前
如何禁用 Vite 中的热更新(HMR)以避免 React 应用加载中断
jvm·数据库·python
m0_7411733312 分钟前
MySQL中如何使用CAST实现类型转换_MySQL数据类型转换技巧
jvm·数据库·python
qq_4135020212 分钟前
如何用 bubbles 属性让自定义事件穿透多个 Web Components
jvm·数据库·python
地球资源数据云13 分钟前
2015年中国30米分辨率沼泽湿地空间分布数据集
大数据·数据结构·数据库·人工智能·机器学习
2301_7756398914 分钟前
如何修改Oracle服务器默认的日期格式_NLS_DATE_FORMAT全局配置
jvm·数据库·python
2401_8314194415 分钟前
React 中父子组件函数传递的正确调用方式
jvm·数据库·python