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 后,字段前
相关推荐
我真会写代码2 小时前
MySQL高频面试题(含详细解析):从基础到高级,备战面试不踩坑
数据库·mysql·面试
观远数据2 小时前
未来3年企业数据分析的核心:基于自然语言的AI优先决策体系如何搭建
数据库·人工智能·数据分析
YummyJacky2 小时前
Redis在项目中的应用
数据库·redis·缓存
qq_283720052 小时前
MySQL 8.0新特性高频面试题 30 道(超详细答案)
数据库·mysql·面试·mysql8·高频试题
wAEWQ6Ib72 小时前
[拆解LangChain执行引擎]支持自然语言查询的长期存储
数据库·oracle·langchain
吴声子夜歌2 小时前
Node.js——操作MongoDB
数据库·mongodb·node.js
空空潍3 小时前
Spring AI 实战系列(十):MCP深度集成 —— 工具暴露与跨服务调用
数据库·人工智能·spring
bIo7lyA8v3 小时前
从 ChangeTracker 到 SQL Batch 的性能诊断与优化
数据库·sql·batch