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

如下所示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如下
CustomerIDCity
FISSAMadrid
FRNDOMAdrid
KRLOSMadrid
MRPHSZion

 

Table 2如下

OrdIDCustomerID
1FRNDO
2FRNDO
3KRLOS
4KRLOS
5KRLOS
6MRPHS
7NULL

 

需要使用的query语句如下:

SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
  LEFT OUTER JOIN dbo.Orders AS O
    ON C.customerid = O.customerid
WHERE C.city = 'Madrid'
GROUP BY C.customerid
HAVING COUNT(O.orderid) < 3
ORDER BY numorders;
第一步,两个table连接并生产一个28行的虚拟表V1(4*7),如下
C.customeridC.cityO.orderidO.customerid
FISSAMadrid1FRNDO
FISSAMadrid2FRNDO
FISSAMadrid3KRLOS
FISSAMadrid4KRLOS
FISSAMadrid5KRLOS
FISSAMadrid6MRPHS
FISSAMadrid7NULL
FRNDOMadrid1FRNDO
FRNDOMadrid2FRNDO
FRNDOMadrid3KRLOS
FRNDOMadrid4KRLOS
FRNDOMadrid5KRLOS
FRNDOMadrid6MRPHS
FRNDOMadrid7NULL
KRLOSMadrid1FRNDO
KRLOSMadrid2FRNDO
KRLOSMadrid3KRLOS
KRLOSMadrid4KRLOS
KRLOSMadrid5KRLOS
KRLOSMadrid6MRPHS
KRLOSMadrid7NULL
MRPHSZion1FRNDO
MRPHSZion2FRNDO
MRPHSZion3KRLOS
MRPHSZion4KRLOS
MRPHSZion5KRLOS
MRPHSZion6MRPHS
MRPHSZion7NULL

 

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

C.customeridC.cityO.orderidO.customerid
FRNDOMadrid1FRNDO
FRNDOMadrid2FRNDO
KRLOSMadrid3KRLOS
KRLOSMadrid4KRLOS
KRLOSMadrid5KRLOS
MRPHSZion6MRPHS

 

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

C.customeridC.cityO.orderidO.customerid
FRNDOMadrid1FRNDO
FRNDOMadrid2FRNDO
KRLOSMadrid3KRLOS
KRLOSMadrid4KRLOS
KRLOSMadrid5KRLOS
MRPHSZion6MRPHS
FISSAMadridNULLNULL

 

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

C.customeridC.cityO.orderidO.customerid
FRNDOMadrid1FRNDO
FRNDOMadrid2FRNDO
KRLOSMadrid3KRLOS
KRLOSMadrid4KRLOS
KRLOSMadrid5KRLOS
FISSAMadridNULLNULL

 

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

C.customeridC.customeridC.cityO.orderidO.customerid
FRNDOFRNDOMadrid1FRNDO
    
FRNDOMadrid2FRNDO
KRLOSKRLOSMadrid3KRLOS
    
KRLOSMadrid4KRLOS
    
KRLOSMadrid5KRLOS
FISSAFISSAMadridNULLNULL

 

第六步,本列中略过

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

C.customeridC.customeridC.cityO.orderidO.customerid
FRNDOFRNDOMadrid1FRNDO
 FRNDOMadrid2FRNDO
FISSAFISSAMadridNULLNULL

 

第八步,执行SELECT,如下

C.customeridnumorders
FRNDO2
FISSA0

 

第九步,执行DISTINCT

第十步,执行ORDER BY,如下

C.customeridnumorders
FISSA0
FRNDO2

 

第十一步,执行TOP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值