您的位置:首页 > 产品设计 > UI/UE

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

2011-03-22 07:26 573 查看
如下所示SQL语句展示了逻辑查询的处理顺序
(8)  SELECT (9) DISTINCT (11)  
(1)  FROM 
(3)     JOIN 
(2)      ON 
(4)  WHERE 
(5)  GROUP BY 
(6)  WITH {CUBE | ROLLUP}
(7)  H***ING 
(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 H***ING:根据条件筛选相应的行插入至虚拟表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 numordersFROM dbo.Customers AS C  LEFT OUTER JOIN dbo.Orders AS O    ON C.customerid = O.customeridWHERE C.city = 'Madrid'GROUP BY C.customeridH***ING COUNT(O.orderid) < 3ORDER 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
第六步,本列中略过第七步,执行H***ING条件,如下
C.customeridC.customeridC.cityO.orderidO.customerid
FRNDOFRNDOMadrid1FRNDO
FRNDOMadrid2FRNDO
FISSAFISSAMadridNULLNULL
第八步,执行SELECT,如下
C.customeridnumorders
FRNDO2
FISSA0
第九步,执行DISTINCT第十步,执行ORDER BY,如下
C.customeridnumorders
FISSA0
FRNDO2
第十一步,执行TOP
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐