当前位置: 首页 > news >正文

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 ServerSELECT后,字段前
http://www.jsqmd.com/news/594700/

相关文章:

  • CSS如何通过CSS变量实现组件颜色隔离_提升组件样式独立性
  • AI Agent商业模式创新:从工具提供商到解决方案服务商的转型
  • EZModbus:面向ESP32的异步无锁Modbus C++库
  • 15K Star 爆火!用大厂 PUA 话术逼 AI 干活,Claude 效率翻倍的黑色幽默工具
  • 告别‘玄学’调参:深入YOLOv11 Neck,用特征可视化理解你的检测器为何漏检小目标
  • 科研不秃头!谁还不知道这个零代码生信神器
  • 吴恩达机器学习第一天
  • Unity Fixed Joint 组件实战:如何用固定关节制作旋转木马效果(附完整代码)
  • JavaScript 中回调函数参数绑定与变量遮蔽问题详解
  • 避坑指南:数据埋点文档常见的5个致命错误(含神策/Sensors Data对比)
  • 嵌入式开发者必看:GitHub高星项目实战解析
  • 运放稳定性补偿实战:从Riso到双反馈,如何为你的MOSFET驱动电路‘降噪’
  • 新手避坑指南:用Boson NetSim 11模拟多子网互联,从连线到ping通的全流程复盘
  • 台达 PLC ES 与 3 台欧姆龙 E5CC 温控器通讯程序分享
  • OpenClaw性能对比:Phi-3-vision-128k-instruct在CPU/GPU环境下的任务表现
  • 避坑指南:ESP32-S3驱动ILI9488屏显示OV2640画面,这些时序和内存问题你遇到了吗?
  • 告别命令行恐惧:用Docker Compose 5分钟拉起一个开箱即用的Yapi服务
  • 在FreeRTOS上为Zynq CAN驱动添加任务间通信:一个实用的数据收发框架搭建
  • 爱毕业aibye推出六大专业学术平台,集成智能改写与高效写作功能,轻松提升科研效率。
  • 信息流优化师和网络营销之间有什么关系_信息流优化师和SEO专业哪个更有前景
  • 逻辑器件设计中的总线保持(Bus Hold)功能解析与实战案例
  • Fujitsu空调本地化控制:ESP32协议逆向与硬件隔离方案
  • 从CH341A编程器、SPI Flash到Linux+STM32理解
  • 国外SEO优化公司如何提高网站在搜索引擎的排名_国外SEO优化公司的服务语言支持有哪些
  • 万物皆可skill
  • seo关键词外包公司哪家好
  • 别再只懂Kruskal和Prim了!用Boruvka算法搞定超大规模图的最小生成树(附C++实现)
  • 别再手动画线了!用uniapp+高德地图SDK,5分钟搞定微信小程序轨迹绘制(附完整代码)
  • HX711称重传感器驱动原理与Arduino高精度应用
  • CentOS 7 安装 MySQL 8.0 完整保姆级教程,避坑指南