SQL Server如何处理以下查询?

时间:2016-09-25 05:04:31

标签: sql sql-server

我正在向数据库发出一些查询:Northwind,可用于证明,如果从官方网站下载,我执行了以下查询:

SELECT C.CategoryName NAME,
    P.CATEGORYID CODE, 
    COUNT(*) 'PIECES',
    SUM(UnitPrice*UnitsInStock) 'AMOUNT'
FROM 
    Northwind.dbo.Categories C, Northwind.dbo.[products] P
WHERE
    P.CategoryID = C.CategoryID
AND 
    P.CategoryID>2
GROUP BY
    P.CategoryID, C.CategoryName
HAVING SUM(UnitPrice*UnitsInStock)>10000
ORDER BY 'AMOUNT' DESC;

查询给出了正确的结果:

NAME            CODE        PIECES      AMOUNT
--------------- ----------- ----------- ---------------------
Seafood         8           12          13010.35
Dairy Products  4           10          11271.20
Confections     3           13          10392.20

事实是我无法弄清楚,SQL Server如何计算该查询,因为涉及许多操作,在某些时候SQL Server必须生成临时数据库来执行HAVING

HAVING SUM(UnitPrice*UnitsInStock)>10000

我想收到有关SQL Server执行查询的顺序的说明,我的意思是SQL Server执行的第一个也是最后一个操作是什么,除了我无法弄清楚它是如何知道的将名为SUM的操作应用于名为:products,

的表
SUM(UnitPrice*UnitsInStock) 'AMOUNT'

我没有说明但是运算效果不错,COUNT对我来说也很模糊但是给了我正确的结果,我真的很感激它如何计算这个查询的详细解释,谢谢为了支持。

1 个答案:

答案 0 :(得分:4)

你必须查看Itzik Ben-Gan对dedicated a whole chapter的查询的逻辑顺序处理,并详细解释每一步...... link is here ......

以下是可以按逻辑顺序执行的子句,每个子句的输出将在下一阶段提交给该子句。

5 SELECT 5.2 DISTINCT 7 TOP <TOP_spec>
                                  5.1 <select_list>
                              1 FROM <table_operators: JOIN, APPLY, PIVOT, UNPIVOT>
                              2 WHERE <predicate>
                              3 GROUP BY <definition_of_grouping_sets>
                              4 HAVING <predicate>
                              6 ORDER BY <order_by_list>
                              7 OFFSET <offset_spec> FETCH <fetch_spec>