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 后,字段前
相关推荐
weelinking2 小时前
【产品】00_产品经理用Claude实现产品系列介绍
数据库·人工智能·sql·数据挖掘·github·产品经理
2301_803934612 小时前
Go语言如何做网络爬虫_Go语言爬虫开发教程【指南】
jvm·数据库·python
秋93 小时前
windows中安装redis
数据库·redis·缓存
Cosolar3 小时前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
想唱rap3 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
SeaTunnel4 小时前
AI 让 SeaTunnel 读源码和调试过时了吗?
大数据·数据库·人工智能·apache·seatunnel·数据同步
凯瑟琳.奥古斯特4 小时前
数据冗余与规范化的本质[数据库原理]
开发语言·数据库·职场和发展
_ku_ku_5 小时前
数据库系统原理 · SQL 数据定义、更新及数据库编程 · 自学总结
数据库·oracle
Mortalbreeze5 小时前
深度理解文件系统 ---- 从磁盘存储到内核存储
大数据·linux·数据库
2301_803934615 小时前
MySQL 字段类型选择规范指南
jvm·数据库·python