SQL执行顺序为FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT,而非书写顺序;FROM先加载数据并连接,WHERE过滤行,GROUP BY分组聚合,HAVING过滤分组,SELECT计算输出列并去重,ORDER BY排序,LIMIT截取结果。

SQL查询语句的执行顺序和书写顺序是两回事——你写的是 SELECT ... FROM ... WHERE ...,但数据库真正执行时,是从 FROM 开始,一步步筛选、计算、去重,最后才生成结果列。理解这个流程,能帮你写出更高效、更准确的SQL,也能快速定位“为什么查不到数据”或“为什么报错”。
执行的第一步是加载基础数据表(或视图、子查询),完成表连接(JOIN)。如果有多个表,数据库会按语法顺序或优化器策略决定连接方式(如嵌套循环、哈希连接)。此时还没过滤、没计算,只是把原始行组合起来。
FROM 后跟了子查询(如 (SELECT ...)),该子查询会先执行并生成临时结果集,再作为“表”参与后续步骤ON 条件在 JOIN 过程中起作用,用于匹配左右表的行;它比 WHERE 更早生效,且对 LEFT JOIN 的右表空值保留至关重要AS t1)在此阶段生效,后续所有步骤都只能用别名引用该表在 FROM 和 JOIN 产出的临时结果集上,应用 WHERE 条件进行筛选。这一步只保留满足条件的行,不满足的整行被丢弃。
WHERE 不能使用 SELECT 中定义的列别名(因为还没到 SELECT 阶段),也不能用聚合函数(如 COUNT()),除非配合 GROUP BY
WHERE 前面,有助于优化器制定更优执行计划NULL 判断需用 IS NULL 或 IS NOT NULL,不能用 = NULL
对 WHERE 筛选后的结果按指定列分组,然后对每组计算聚合值(如 SUM()、AVG()、COUNT())。这一步输出的是“组”而不是原始行。
GROUP BY 后的列,或聚合函数内的列,才能出现在 SELECT 中(否则报错,如 MySQL 严格模式)HAVING 在此阶段后立即执行,用于过滤分组结果(例如 HAVING COUNT(*) > 5),它能引用聚合函数,而 WHERE 不能GROUP BY 时,整个结果集被视为一个组,聚合函数作用于全部数据这是逻辑上倒数第二步:计算 SELECT 列表中的表达式(包括列名、别名、函数、运算等),并可选地去重(DISTINCT)。
ORDER BY)中可用;但 WHERE 和 GROUP BY 中不可用DISTINCT 是在所有 SELECT 表达式计算完成后,对整行结果去重,开销较大,应避免在大结果集上滥用ROW_NUMBER() OVER(...))也在此阶段计算,但它们不改变行数,只增加计算列最后两步:先按指定列或表达式排序(升序 ASC 或降序 DESC),再取前 N 行(LIMIT / TOP / FETCH FIRST,依数据库而异)。
ORDER BY 可以引用 SELECT 中的列别名、位置序号(如 ORDER BY 2 表示第二列),甚至未出现在 SELECT 中的列(只要它在 FROM 结果里存在)LIMIT(或等效语法)必须放在最后,否则语法错误;它作用于已排序的结果,不是原始数据ORDER BY 时,LIMIT 返回的行顺序是不确定的,不要依赖默认顺序掌握这个执行顺序,你就知道为什么 WHERE 不能写聚合、为什么 ORDER BY 能用别名、为什么 LEFT JOIN 加 WHERE 条件可能变成交叉过滤。不复杂但容易忽略。
以上就是SQL查询语句执行顺序详解_FROM到SELECT完整流程说明【教程】的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号