您当前的位置: 首页 >  sql

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SQL中的执行顺序解释

寒冰屋 发布时间:2022-06-29 22:23:06 ,浏览量:1

目录

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执行顺序的口头解释

这就是正在发生的事情。

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

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

  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

 

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0443s