Yihui’s Blog

SQL 中 SELECT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 的执行顺序是什么?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #SQL #执行顺序 #VIP

一句话答案

逻辑处理顺序通常是 FROM/JOIN/ON → WHERE → GROUP BY → 聚合计算 → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT;实际物理执行会被优化器改写。

面试口语版

先从 FROM 确定数据源,按 JOIN 和 ON 形成连接结果;WHERE 在分组前过滤行;GROUP BY 分组并计算聚合;HAVING 过滤分组;SELECT 计算输出列,之后处理 DISTINCT;ORDER BY 排序,最后 LIMIT 截取结果。这个顺序能解释为什么聚合条件一般写 HAVING、WHERE 通常不能直接引用本层 SELECT 别名,而 ORDER BY 可以。但它是 SQL 的逻辑语义顺序,优化器可能做谓词下推、连接重排和提前 LIMIT,物理执行不一定逐阶段生成中间表。

原理拆解

flowchart LR
  A[FROM] --> B[JOIN/ON]
  B --> C[WHERE]
  C --> D[GROUP BY/聚合]
  D --> E[HAVING]
  E --> F[SELECT]
  F --> G[DISTINCT]
  G --> H[ORDER BY]
  H --> I[LIMIT]

关键细节

  • ON 决定连接匹配,WHERE 过滤连接后的行;外连接中两者位置会影响结果。
  • WHERE 不能使用聚合结果,因为此时尚未分组;聚合过滤用 HAVING。
  • MySQL 对别名和 GROUP BY 有部分扩展语法,跨数据库时不要依赖非标准行为。

面试官追问

  1. LEFT JOIN 的右表条件放 ON 和 WHERE 有何区别?
  2. WHERE 与 HAVING 如何选择?
  3. 为什么 ORDER BY 可以使用 SELECT 别名?

高分补充

区分“逻辑顺序”和“执行计划”能避免把 SQL 语义解释成数据库内部固定流水线。

学习清单

  • 手写完整顺序,并用别名、聚合和 LEFT JOIN 各举一例。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文