首页 > 数据库 > SQL > 正文

SQL执行顺序深度解析_SQL SELECT执行流程说明

冷漠man
发布: 2025-12-05 22:05:02
原创
242人浏览过
SQL执行顺序为FROM→WHERE→GROUP BY→HAVING→SELECT→DISTINCT→ORDER BY→LIMIT,而非书写顺序;FROM最先加载数据源,WHERE过滤原始行,GROUP BY分组后HAVING筛选分组结果,SELECT才计算表达式和别名,最后ORDER BY排序、LIMIT截断。

sql执行顺序深度解析_sql select执行流程说明

SQL的SELECT语句看似简单,实际执行时并非按书写顺序运行。理解其真实执行顺序,是写出高效、正确查询的基础,也能帮你避开常见陷阱,比如WHERE中引用了SELECT里定义的别名、或GROUP BY和聚合函数配合出错等问题。

FROM:最先执行,确定数据源

无论你写多少表、用什么JOIN,数据库第一步永远是从FROM子句开始——加载基础表或视图,生成初始的笛卡尔积(如果有多表且没ON条件)。如果有子查询或CTE(WITH),也会在此阶段完成物化或展开。

  • 多表JOIN时,优化器可能重排表顺序,但逻辑上仍以FROM列出的表为起点
  • 如果FROM中包含复杂的子查询,它会先执行完,结果作为临时“虚表”供后续步骤使用
  • 注意:WHERE、GROUP BY等都不能影响FROM阶段的表加载,哪怕WHERE条件再严格,全表扫描仍可能在FROM阶段发生

WHERE → GROUP BY → HAVING:筛选与分组三步连动

在FROM产出初始行集后,数据库立即应用WHERE过滤——这是第一个真正“减少数据量”的环节。接着按GROUP BY分组,再用HAVING对分组结果做二次筛选。这三者构成一个紧密的“分组前/后筛选链”。

Winston AI
Winston AI

强大的AI内容检测解决方案

Winston AI 138
查看详情 Winston AI
  • WHERE作用于原始行,不能用聚合函数(如SUM、COUNT)或SELECT中的列别名
  • GROUP BY必须包含SELECT中所有非聚合列(严格模式下),否则报错
  • HAVING可引用聚合函数和GROUP BY字段,但不能引用WHERE未出现的非分组列

SELECT → DISTINCT → ORDER BY → LIMIT:最终呈现层

直到这时,SELECT才真正执行——计算表达式、取别名、去重(DISTINCT)、排序(ORDER BY)、截断(LIMIT/OFFSET)。这个阶段的数据已不可被WHERE或HAVING修改。

  • SELECT中定义的别名,在WHERE、GROUP BY、HAVING中都不可用(因为它们早已执行完毕)
  • ORDER BY可以引用SELECT中的别名或位置序号(如ORDER BY 1),但标准SQL更推荐用别名
  • LIMIT不是SQL标准语法(MySQL/PostgreSQL支持,SQL Server用TOP,Oracle用ROWNUM或FETCH FIRST),但它总在最后生效,不改变逻辑结果集大小,只控制返回行数

基本上就这些。记住:写的时候从SELECT开始顺手敲,跑的时候从FROM开始层层推进。搞清这个顺序,很多“为什么报错”“为什么结果不对”的问题就迎刃而解了。

以上就是SQL执行顺序深度解析_SQL SELECT执行流程说明的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号