SQL中的执行顺序解释

目录

SQL执行顺序的口头解释

我为什么要知道这个?

结论


了解SQL中的执行顺序,有助于更好地理解SQL拔毛错误!当您开始使用SQL时,您会发现一些错误没有意义,或者您想知道为什么您可以在ORDER BY子句中使用列别名,但不能在连接条件中使用。

当您了解SQL的查询处理器读取”SQL并处理它以执行您的查询的顺序时,您就会开始理解为什么会这样。

鉴于人类阅读屏幕上显示的SQL,因此我们认为计算机会以相同的方式阅读SQL是有道理的。

但事实并非如此。事实上,查询引擎如何处理SQL似乎是零散的。以下是微软官方的执行顺序:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE or WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

让我们看一个例子,看看执行顺序如何发挥作用:

SQL 执行顺序(点击图片放大)

注意我们倾向于从上到下从左到右阅读语句,DBMS查询处理器首先检查FROM语句,然后从那里继续。

SELECT(第8步)中的列别名是我们示例中最后评估的部分之一,这可能会让人感到奇怪!

SQL执行顺序的口头解释

这就是正在发生的事情。

在查询处理器运行查询之前,它首先需要知道查询中涉及哪些表。因此,查询处理器首先评估FROMJOIN子句(步骤 12 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通过,但其他查询不通过。

以下是我获得的一些见解,希望对您也有帮助:

  1. 我一直想知道为什么我不能在我的WHERE子句中使用别名……现在我知道了,因为直到WHERE子句之后的步骤才发现别名。
  2. 同样,我想知道为什么我可以在order by中使用列别名,它位于语句的底部,但不能位于中间。

本文最初发布于Order of Execution in SQL Explained - Essential SQL

https://www.codeproject.com/Articles/5326837/Order-of-Execution-in-SQL-Explained

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值