当前位置:Gxlcms > 数据库问题 > 《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

时间:2021-07-01 10:21:17 帮助过:11人阅读

dbo.Customers AS C LEFT OUTER JOIN dbo.Orders AS O ON C.customerid = O.customerid

  步骤1-J1=>笛卡尔积

  这里先不考虑LEFT OUTER,通过JOIN交叉联接后形成虚拟表VT1-J1:

  技术分享图片

  步骤1-J2=>ON筛选器

  ON筛选器的作用在于从上一步生成的虚拟表VT1-J1中的所有行中筛选出只有使 C.customerid = O.customerid 为TRUE的那些行,将其输出到新的虚拟表VT1-J2中。

  技术分享图片

  步骤1-J3=>添加外部行

  这一步只会在外链接(OUTER JOIN)中才会发生。这里是:Customers AS C LEFT OUTER JOIN Orders AS O,即Customer作为保留表。最终的虚拟表VT1-J3如下:

  技术分享图片

  *.这里Customer作为保留表,所以FISSA虽然没有满足ON筛选器,但是也会被添加到虚拟表中。

  (2)WHERE阶段:

WHERE C.city = Madrid

  在此阶段会去掉VT1中客户为MRPHS的行(因为其cityid不是Madrid),生成如下所示的VT2:

  技术分享图片

ON和WHERE的区别:WHERE对行的删除是最终的,而ON对行的删除并不是,因此步骤1-J3添加外部行时会再添加回来。此外,只有当使用外连接时,ON和WHERE才存在这种逻辑区别。 

  (3)GROUP BY阶段:

GROUP BY C.customerid

  这一步将VT2中的数据行按组进行重组,得到VT3如下图所示:

  技术分享图片

  (4)HAVING阶段:

HAVING COUNT(O.orderid) < 3

  这一步从VT3中进行筛选,只有使得COUNT(O.orderid)<3逻辑值为TRUE的组,才会进入到VT4。HAVING筛选器是唯一可用于分组数据的筛选器。

  技术分享图片

这里没有使用COUNT(*)是因为在外联接中,COUNT(*)会把外部行也统计在内,比如会将FISSA的订单数统计为1,这明显是错误的。  

  (5)SELECT阶段:

  步骤5-1=>计算表达式

SELECT C.customerid, COUNT(O.orderid) as numorders

  得到VT5-1

  技术分享图片

  步骤5-2=>应用DISTINCT子句

  此示例木有DISTINCT子句,故VT5-1没有变化。

  步骤5-3=>应用TOP选项

  TOP选项时T-SQL特有的一项功能,允许指定要返回的行数或百分比。不过,此示例也没有指定TOP,估计VT5=VT5-1。

  (6)ORDER BY阶段:

ORDER BY numorders

  这一步将对VT5进行排序,返回游标VC6。ORDER BY子句也是唯一可以重用SELECT列表中创建的列别名的步骤

  技术分享图片

参考资料

  技术分享图片

  [美] Itzik Ben-Gan 著,成保栋 译,《Microsoft SQL Server 2008技术内幕:T-SQL查询》

 

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

标签:页面   运算符   声明   插入   block   list   添加   关于   读书笔记   

人气教程排行