Inside Microsoft SQL Server 2005:T-SQL Querying (逻辑查询处理顺序|第一章)

来源:互联网 发布:k11防水和js防水的区别 编辑:程序博客网 时间:2024/05/01 23:08

如下所示SQL语句展示了逻辑查询的处理顺序

(8)  SELECT (9) DISTINCT (11)  (1)  FROM (3)     JOIN (2)      ON (4)  WHERE (5)  GROUP BY (6)  WITH {CUBE | ROLLUP}(7)  HAVING (10) ORDER BY 
步骤1 FROM:查询语句中from语句中的两个表进行交叉连接,生成虚拟表V1
步骤2 ON:筛选器ON应用到V1上,并把满足条件的行插入虚拟表V2
步骤3 OUTER(join):如果SQL语句中选择了OUTER JOIN则将其余的行也插入V2,生成虚拟表V3,。如果join语句中存在多个table,则重复以上步骤。
步骤4 WHERE:根据条件筛选相应的行插入至虚拟表V4
步骤5 GROUP BY:分类V4并插入虚拟表V5
步骤6 CUBE | ROLLUP:增加超级组的行至V5,生成V6
步骤7 HAVING:根据条件筛选相应的行插入至虚拟表V7
步骤8 SELECT:生成SELECT内容,生成V8
步骤9 DISTINCT:去掉重复的行,生成V9
步骤10 ORDER BY:排序生成V10
步骤11 TOP:保留前几条记录并返回结果

我们可以通过一个具体实例说明问题
Table 1如下
CustomerIDCityFISSAMadridFRNDOMAdridKRLOSMadridMRPHSZion

 

Table 2如下

OrdIDCustomerID1FRNDO2FRNDO3KRLOS4KRLOS5KRLOS6MRPHS7NULL

 

需要使用的query语句如下:

SELECT C.customerid, COUNT(O.orderid) AS numordersFROM dbo.Customers AS C  LEFT OUTER JOIN dbo.Orders AS O    ON C.customerid = O.customeridWHERE C.city = 'Madrid'GROUP BY C.customeridHAVING COUNT(O.orderid) < 3ORDER BY numorders;
第一步,两个table连接并生产一个28行的虚拟表V1(4*7),如下
C.customeridC.cityO.orderidO.customeridFISSAMadrid1FRNDOFISSAMadrid2FRNDOFISSAMadrid3KRLOSFISSAMadrid4KRLOSFISSAMadrid5KRLOSFISSAMadrid6MRPHSFISSAMadrid7NULLFRNDOMadrid1FRNDOFRNDOMadrid2FRNDOFRNDOMadrid3KRLOSFRNDOMadrid4KRLOSFRNDOMadrid5KRLOSFRNDOMadrid6MRPHSFRNDOMadrid7NULLKRLOSMadrid1FRNDOKRLOSMadrid2FRNDOKRLOSMadrid3KRLOSKRLOSMadrid4KRLOSKRLOSMadrid5KRLOSKRLOSMadrid6MRPHSKRLOSMadrid7NULLMRPHSZion1FRNDOMRPHSZion2FRNDOMRPHSZion3KRLOSMRPHSZion4KRLOSMRPHSZion5KRLOSMRPHSZion6MRPHSMRPHSZion7NULL

 

第二步,判断ON的条件生产虚拟表V2,如下

C.customeridC.cityO.orderidO.customeridFRNDOMadrid1FRNDOFRNDOMadrid2FRNDOKRLOSMadrid3KRLOSKRLOSMadrid4KRLOSKRLOSMadrid5KRLOSMRPHSZion6MRPHS

 

第三步,添加OUTER JOIN的结果,如下

C.customeridC.cityO.orderidO.customeridFRNDOMadrid1FRNDOFRNDOMadrid2FRNDOKRLOSMadrid3KRLOSKRLOSMadrid4KRLOSKRLOSMadrid5KRLOSMRPHSZion6MRPHSFISSAMadridNULLNULL

 

第四步,执行WHERE条件判断,如下

C.customeridC.cityO.orderidO.customeridFRNDOMadrid1FRNDOFRNDOMadrid2FRNDOKRLOSMadrid3KRLOSKRLOSMadrid4KRLOSKRLOSMadrid5KRLOSFISSAMadridNULLNULL

 

第五步,执行GROUP排序,如下

C.customeridC.customeridC.cityO.orderidO.customeridFRNDOFRNDOMadrid1FRNDO    FRNDOMadrid2FRNDOKRLOSKRLOSMadrid3KRLOS    KRLOSMadrid4KRLOS    KRLOSMadrid5KRLOSFISSAFISSAMadridNULLNULL

 

第六步,本列中略过

第七步,执行HAVING条件,如下

C.customeridC.customeridC.cityO.orderidO.customeridFRNDOFRNDOMadrid1FRNDO FRNDOMadrid2FRNDOFISSAFISSAMadridNULLNULL

 

第八步,执行SELECT,如下

C.customeridnumordersFRNDO2FISSA0

 

第九步,执行DISTINCT

第十步,执行ORDER BY,如下

C.customeridnumordersFISSA0FRNDO2

 

第十一步,执行TOP

原创粉丝点击