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 后,字段前
相关推荐
SelectDB5 分钟前
Doris 还是 ClickHouse?一张表说清 6 个关键差异(实战笔记)
大数据·数据库·数据分析
oradh39 分钟前
Oracle Undo问题总结(两类Undo表空间不足和单个会话占用大量Undo的性能问题)
数据库·oracle
企业数字化笔记44 分钟前
固定资产财务账与实物账怎么对账?折旧快照、差异检测与SQL核对
android·数据库·sql
DBA_G1 小时前
GBase 8a表空间多路径存储数据迁移链路适配解析
数据库·oracle
java1234_小锋1 小时前
Tornado 6.5,全面支持 Python 3.14
数据库·python·tornado
jyOverQ1 小时前
MySQL 事务到底是什么?ACID 四大特性与隔离级别怎么理解?
数据库·mysql
SelectDB1 小时前
Doris 直查 Paimon 索引:快手湖上向量检索的共建与落地
大数据·数据库·数据分析
风123456789~1 小时前
【Oracle专栏】全局 && 本地复合索引 实验
数据库·oracle
1314lay_10071 小时前
通过Sql Server创建EXCEL文件:master..xp_cmdshell
数据库·excel
zzzll11112 小时前
用 DeepSeek Harness 手搓一个自己的 Agent
数据库