SQL Server执行顺序

时间:2018-08-24 16:24:57

标签: sql sql-server tsql

我知道在SQL中执行的顺序是

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

所以我对相关查询感到困惑,如下面的代码。

是先执行外部查询中的FROM WHERE子句,还是先执行内部查询中的SELECT?谁能给我想法和解释?谢谢

SELECT 
    *, COUNT(1) OVER(PARTITION BY A) pt  
FROM
    (SELECT 
         tt.*,
         (SELECT COUNT(id) FROM t WHERE data <= 10 AND ID < tt.ID) AS A
     FROM  
         t tt
     WHERE  
         data > 10) t1

1 个答案:

答案 0 :(得分:2)

  

我知道在SQL中执行的顺序是FROM-> WHERE-> GROUP BY-> HAVING-> SELECT-> ORDER BY

错。假。假。大概您指的是documentation的这一部分:

  

以下步骤显示了逻辑处理顺序或绑定   命令,用于SELECT语句。此顺序确定对象何时   一步中定义的内容可用于后续的子句   步骤。

如文档所述,这是指解析查询时的作用域规则。它与执行顺序无关。与几乎所有数据库一样,SQL Server保留了重新排列查询的能力,但它喜欢进行处理。

实际上,执行计划实际上是有向无环图(DAG),其组件通常与查询中的子句不具有1-1关系。只要SQL Server产生您描述的结果集,SQL Server便可以以其认为最佳的方式自由执行查询。