此SQL语句的执行顺序是什么

时间:2013-07-01 11:55:40

标签: sql sql-server-2008

我有以下SQL查询,

SELECT TOP 5 C.CustomerID,C.CustomerName,C.CustomerSalary
FROM Customer C
WHERE C.CustomerSalary > 10000
ORDER BY C.CustomerSalary DESC

以下是执行顺序的正确解释,

  1. TOP Clause
  2. WHERE Clause
  3. ORDER BY Clause

7 个答案:

答案 0 :(得分:55)

查看the documentation for the SELECT statement,尤其是此部分:

  

SELECT语句的逻辑处理顺序

     

以下步骤显示逻辑处理顺序或绑定   order,用于SELECT语句。此顺序确定对象的时间   在一个步骤中定义的内容可供后续条款使用   脚步。例如,如果查询处理器可以绑定(访问)   FROM子句中定义的表或视图,这些对象及其对象   列可用于所有后续步骤。反过来,   因为SELECT子句是步骤8,任何列别名或派生   该子句中定义的列不能通过前面引用   条款。但是,它们可以通过后续条款引用,例如   ORDER BY子句。 注意实际的物理执行情况   语句由查询处理器确定,顺序可能不同   从此列表中。

给出以下顺序:

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP

答案 1 :(得分:14)

答案 2 :(得分:10)

这是您的案例的确切执行顺序。

1-FROM
2-WHERE
3-SELECT 
4-ORDER BY
5-TOP

答案 3 :(得分:9)

只需记住这句话: -     弗雷德琼斯奇怪的坟墓有几只沉闷的猫头鹰

取每个单词的第一个字母,你得到: -

FROM
(ON)
JOIN
WHERE
GROUP BY
(WITH CUBE or WITH ROLLUP)
HAVING
SELECT
DISTINCT
ORDER BY
TOP

希望有所帮助。

答案 4 :(得分:6)

TOP,WHERE和ORDER BY没有“执行” - 它们只是描述了所需的结果,数据库查询优化器确定(希望)实际执行的最佳计划。 “声明所需结果”与物理实现方式之间的分离是使SQL成为“声明性”语言的原因。

假设CustomerSalary上有索引,并且表已群集,则您的查询可能会作为索引搜索+表堆访问执行,如此{{ 3}}(点击底部的查看执行计划):

enter image description here

如您所见,首先通过 Index Seek 找到正确的CustomerSalary值,然后通过 RID Lookup从表堆中检索值所属的行(行ID查找)。 Top 仅用于显示(并且具有0%的成本),就像嵌套循环一样 - 起始索引搜索将返回(最多)一行在任何情况下。整个查询非常有效,并且可能只需要几次I / O操作。

如果表是SQL Fiddle,您可能会有另一个索引查找而不是表堆访问,如此clustered所示(请注意DDL SQL中缺少NONCLUSTERED关键字):

enter image description here

但要注意:这次我很幸运能够获得“正确”的执行计划。查询优化器可能已选择全表扫描,有时在小表上实际上更快。在分析查询计划时,请始终尝试对实际数据量执行此操作!

答案 5 :(得分:2)

我的0,02美元。

这里有两个不同的概念:逻辑执行顺序和查询执行计划。另一个是看谁回答了以下问题:

  1. MSSQL如何理解我的SQL查询?
  2. 在给定当前架构和数据的情况下,以最佳方式执行它会做什么?
  3. 第一个问题由逻辑执行顺序回答。 Brian's answer显示它是什么。这是SQL理解您的命令的方式:“FROM Customer表(别名为C)仅考虑C.CustomerSalary> 10000的行WHERE,按顺序将它们按顺序排列为C.CustomerSalary,并选择列出的TOP 5行的列” 。结果集将遵循该含义

    第二个问题的答案是查询执行计划 - 它取决于您的架构(表定义,数据选择性,客户表中的行数,定义的索引等),因为它严重依赖于SQL Server优化器内部工作。

答案 6 :(得分:2)

访问https://msdn.microsoft.com/en-us/library/ms189499.aspx以获得更好的解释。

以下步骤显示SELECT语句的逻辑处理顺序或绑定顺序。此顺序确定在一个步骤中定义的对象何时可用于后续步骤中的子句。例如,如果查询处理器可以绑定(访问)FROM子句中定义的表或视图,则这些对象及其列可供所有后续步骤使用。相反,因为SELECT子句是步骤8,所以前面的子句不能引用该子句中定义的任何列别名或派生列。但是,它们可以由后续子句引用,例如ORDER BY子句。请注意,语句的实际物理执行由查询处理器确定,并且顺序可能与此列表不同。

发件人

打开

<强> JOIN

<强> WHERE

GROUP BY

WITH CUBE或WITH ROLLUP

<强> HAVING

选择

<强> DISTINCT

ORDER BY

热门