sql - SQL Server 如何处理以下查询?

标签 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 执行的第一个和最后一个操作是什么,此外我不知道它如何知道必须应用该操作对名为: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/

相关文章:

sql - 具有方法语法的 LINQ 中的 JOIN 和 LEFT JOIN 等效

sql-server - Delphi 应用程序中的脚本编写

sql - EF Core、FromSqlRaw 和 USE HINT

sql - 页拆分?这个怎么运作?

java - 为什么我的 Java 代码会覆盖我的 sql 代码?

mysql - 查询总收入

SQL: 选择时出现 ORA-00933 错误

c++ - 在哪里存储 C++ 应用程序的 SQL 代码?

mysql - 在mysql中按月和年生成报告

sql - 按照插入的确切顺序返回行