我正在对名为 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 执行的第一个和最后一个操作是什么,此外我不知道它如何知道必须应用该操作对名为:products 的表执行名为 SUM 的操作,
SUM(UnitPrice*UnitsInStock) 'AMOUNT'
我没有指定,但是该操作计算得很好,而且 COUNT
对我来说非常模糊,但给了我正确的结果,我真的很感谢任何关于它如何计算的详细解释询问,感谢支持。
最佳答案
您必须查看 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>
关于sql - SQL Server 如何处理以下查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39683580/