0Pricing
SQL Interview Prep · 课时

逻辑查询执行顺序

了解为什么 FROM 先于 SELECT 执行,以及掌握真正的执行顺序如何解答十多个陷阱问题

逻辑查询执行顺序 是 CoddyKit 上的免费 SQL Interview Prep 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Interview Prep 课程共包含 4 节课。

一道能引出十多个问题的题目

面试官会问“查询实际上是按什么顺序执行的?”,因为这个问题能解释许多现象:为什么在 WHERE 中使用 SELECT 别名会失败,为什么 WHERE 不能筛选聚合结果,等等。

书写顺序与逻辑顺序

您书写查询时从 SELECT 开始,但引擎执行查询时从 FROM 开始。这种不一致,再加上 SELECT 几乎最后才求值,是大多数困惑的来源。

完整的逻辑顺序

完整的逻辑顺序是:FROM,然后是 WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY,最后是 LIMIT。下面的每个易错点都可以直接从这个顺序推导出来。

为什么 FROM 最先执行

FROM 最先执行,因为引擎需要先获得要处理的行。它会先构建来源行,之后 WHERE 才能决定保留哪些行。

SELECT e.name, d.name AS dept
FROM employees e
JOIN departments d ON d.id = e.department_id
WHERE e.salary > 50000;

易错点:WHERE 中不能使用别名

最常被问到的一个结果是:SELECT 别名不能在 WHERE 中使用,因为 WHERE 先于 SELECT 执行。下面的代码展示了错误及其修复方法:重复写出该表达式。

-- FAILS: alias 'annual' unknown in WHERE
SELECT salary * 12 AS annual
FROM employees
WHERE annual > 600000;

-- FIX: repeat the expression
SELECT salary * 12 AS annual
FROM employees
WHERE salary * 12 > 600000;

易错点:WHERE 看不到聚合结果

WHERE 在分组之前执行,因此看不到聚合结果,例如 COUNT() 的结果。这正是 HAVING 的用途:WHERE 筛选行,HAVING 在聚合后筛选分组。

-- WHERE cannot use COUNT(*)
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

为什么 ORDER BY 可以使用别名

相反,ORDER BY 在 SELECT 之后执行,因此可以使用 SELECT 别名。同一个别名,由于执行时机不同,所以在这里可以使用,在 WHERE 中却不行。

SELECT name, salary * 12 AS annual
FROM employees
ORDER BY annual DESC;

DISTINCT 处于什么位置

DISTINCT 在 SELECT 之后、ORDER BY 之前执行。因为它会根据输出列去重,所以您只能按照最终保留在选择列表中的内容排序。

-- ERROR in many engines:
-- ORDER BY column not in the DISTINCT select list
SELECT DISTINCT department
FROM employees
ORDER BY hire_date;

完整查询的执行过程示例

让我们跟踪一个真实查询的执行步骤:FROM 读取行,WHERE 筛选行,GROUP BY 分组,HAVING 保留分组,SELECT 计算结果,ORDER BY 排序,LIMIT 截取结果。

SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(amount) > 1000
ORDER BY total DESC
LIMIT 10;

逻辑执行与物理执行

有一个细节可以体现您的理解深度:这里讲的是决定正确性的逻辑顺序。只要最终产生相同的行,优化器的物理执行计划可以有所不同。

记忆执行顺序的方法

可以这样记忆:想象行沿着一条流水线向下流动,每一步都把更小的数据集交给下一步。当某个地方出错时,请检查前面的步骤是否产生了它所需要的内容。

快速检查

请运用执行顺序找出错误。

回顾

回顾:逻辑顺序是 FROM、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMIT。WHERE 在 SELECT 之前执行(不能使用别名);ORDER BY 在 SELECT 之后执行(可以使用别名)。

常见问题解答

「逻辑查询执行顺序」课时是免费的吗?

是的 — 「逻辑查询执行顺序」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 SQL Interview Prep 课程共包含 4 节课。

「逻辑查询执行顺序」这节课中我会学到什么?

了解为什么 FROM 先于 SELECT 执行,以及掌握真正的执行顺序如何解答十多个陷阱问题 你通过在浏览器中直接运行的动手代码来练习 SQL Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「逻辑查询执行顺序」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Interview Prep 课中编写并运行代码吗?

能。每节 SQL Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是 SQL,以及面试官为什么会问它
  2. 逻辑查询执行顺序
  3. 主键、外键与约束
  4. 在压力下阅读架构
← 返回 SQL Interview Prep