目录
SQL执行顺序的口头解释
我为什么要知道这个?
结论
了解SQL中的执行顺序,有助于更好地理解SQL的“拔毛”错误!当您开始使用SQL时,您会发现一些错误没有意义,或者您想知道为什么您可以在ORDER BY子句中使用列别名,但不能在连接条件中使用。
当您了解SQL的查询处理器“读取”SQL并处理它以执行您的查询的顺序时,您就会开始理解为什么会这样。
鉴于人类阅读屏幕上显示的SQL,因此我们认为计算机会以相同的方式阅读SQL是有道理的。
但事实并非如此。事实上,查询引擎如何处理SQL似乎是零散的。以下是微软官方的执行顺序:
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE or WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
让我们看一个例子,看看执行顺序如何发挥作用:
SQL 执行顺序(点击图片放大)
注意我们倾向于从上到下从左到右阅读语句,DBMS查询处理器首先检查FROM语句,然后从那里继续。
SELECT(第8步)中的列别名是我们示例中最后评估的部分之一,这可能会让人感到奇怪!
SQL执行顺序的口头解释这就是正在发生的事情。
在查询处理器运行查询之前,它首先需要知道查询中涉及哪些表。因此,查询处理器首先评估FROM和JOIN子句(步骤 1、2 和 3)。
第 4 步过滤掉WHERE子句中的行。
查询处理器现在拥有正确的信息来“知道”如何请求数据。在我们的示例中,重点现在转向准备结果的外观。
在步骤 8 中,显示列由查询处理器准备。处理器在这里分配任何列别名。
最后,在步骤 10 中,查询处理器准备ORDER BY子句。
我为什么要知道这个?在编写SQL并对其进行故障排除时,了解执行顺序会很有帮助。
如果您知道执行顺序,则以下特质是有意义的:
- 为什么您可以在整个SQL中使用表别名,但不能使用列别名。
- 为什么可以在order by子句中使用列别名。
- 为什么不能在WHERE子句中使用列别名。
每当我编写SQL时,我都会牢记执行顺序。特别是当我去运行SQL时,我得到一个语法错误!发生这种情况时,我会考虑错误以及是否在查询处理器“知道”它的存在之前尝试使用列名或其他对象。
你为什么要亲自尝试?
这条语句有一个错误。尝试运行它,找到错误,看看是否可以修复它。
/* Answer */
/* Notice you can not use an aliased column name in the WHERE clause */
SELECT p.ProductNumber, p.Name ProductName, i.Bin, i.LocationID, i.Quantity
FROM Production.ProductInventory i
INNER JOIN Production.Product p on i.ProductID = p.ProductID
WHERE p.Name like '%Mountain%'
ORDER BY ProductName
了解SQL如何处理您的SQL肯定会帮助您了解如何编写更好的SQL并了解为什么某些SQL作为合法SQL通过,但其他查询不通过。
以下是我获得的一些见解,希望对您也有帮助:
- 我一直想知道为什么我不能在我的WHERE子句中使用别名……现在我知道了,因为直到WHERE子句之后的步骤才发现别名。
- 同样,我想知道为什么我可以在order by中使用列别名,它位于语句的底部,但不能位于中间。
本文最初发布于Order of Execution in SQL Explained - Essential SQL
https://www.codeproject.com/Articles/5326837/Order-of-Execution-in-SQL-Explained