我有以下SQL查询,
SELECT TOP 5 C.CustomerID,C.CustomerName,C.CustomerSalary
FROM Customer C
WHERE C.CustomerSalary > 10000
ORDER BY C.CustomerSalary DESC
以下是执行顺序的正确解释,
答案 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)
WHERE
ORDER BY
TOP
答案 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}}(点击底部的查看执行计划):
如您所见,首先通过 Index Seek 找到正确的CustomerSalary
值,然后通过 RID Lookup从表堆中检索值所属的行(行ID查找)。 Top 仅用于显示(并且具有0%的成本),就像嵌套循环一样 - 起始索引搜索将返回(最多)一行在任何情况下。整个查询非常有效,并且可能只需要几次I / O操作。
如果表是SQL Fiddle,您可能会有另一个索引查找而不是表堆访问,如此clustered所示(请注意DDL SQL中缺少NONCLUSTERED关键字):
但要注意:这次我很幸运能够获得“正确”的执行计划。查询优化器可能已选择全表扫描,有时在小表上实际上更快。在分析查询计划时,请始终尝试对实际数据量执行此操作!
答案 5 :(得分:2)
我的0,02美元。
这里有两个不同的概念:逻辑执行顺序和查询执行计划。另一个是看谁回答了以下问题:
第一个问题由逻辑执行顺序回答。 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
热门强>