我正在向数据库发出一些查询: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
对我来说也很模糊但是给了我正确的结果,我真的很感激它如何计算这个查询的详细解释,谢谢为了支持。
答案 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>