做网站的学校,杭州洛可可设计公司,Wordpress 建站 软件,江西网站建设哪家公司好【T-SQL】| 作者 / Edison Zhou这是EdisonTalk的第296篇学习分享T-SQL是ANSI和ISO SQL标准的MS SQL扩展#xff0c;其正式名称为Transact-SQL#xff0c;但一般程序员都称其为T-SQL。本文是我学习《T-SQL查询》一书的读书笔记#xff0c;为你讲解逻辑查询的内幕。1逻辑查询处… 【T-SQL】| 作者 / Edison Zhou这是EdisonTalk的第296篇学习分享T-SQL是ANSI和ISO SQL标准的MS SQL扩展其正式名称为Transact-SQL但一般程序员都称其为T-SQL。本文是我学习《T-SQL查询》一书的读书笔记为你讲解逻辑查询的内幕。1逻辑查询处理的各个阶段流程总览阶段解释1FROM标识出查询的来源表处理表运算符。每个运算符会应用一系列的子阶段。eg.在JOIN连接运算中涉及的阶段是笛卡尔积、ON筛选器和添加外部行。FROM阶段会生成一个虚拟表这里暂定为VT1。1-J1笛卡尔积对涉及到的两个表执行笛卡尔积交叉联接生成虚拟表VT1-J1。1-J2ON筛选器对VT1-J1中的行根据ON子句中出现的谓词进行筛选。只有让该谓词取值为TRUE的行才能插入到VT1-J2中。1-J3添加外部行如果指定了OUTER JOIN相对于CROSS JOIN或INNER JOIN则将保留表Preserved Table中没有找到匹配的行作为外部行添加到VT1-J2中生成VT1-J3。2WHERE根据在WHERE子句中出现的谓词对VT1中的行进行筛选。只有让谓词计算结果为TRUE的行才会插入VT2中。3GROUP BY按照GROUP BY子句中指定的列名列表将VT2中的行进行分组生成VT3。最终每个分组只有一个结果行。4HAVING根据HAVING子句出现的谓词对VT3中的分组进行筛选。只有让谓词计算结果为TRUE的行才会插入VT4。5SELECT处理SELECT子句中的元素产生VT5。5-1计算表达式计算SELECT列表中的表达式生成VT5-1。5-2DISTINCT删除VT5-1中的重复行生成VT5-2。5-3TOP根据ORDER BY子句定义的逻辑排序从VT5-2中选择前面指定数量或百分比的行生成VT5-3。6ORDER BY根据ORDER BY子句中指定的列名列表对VT5-3中的行进行排序生成游标VC6。2一个逻辑查询的示例示例场景假设有两张表Customers和Orders表结构和数据如下 这里我们要查询来自Madrid并且订单数少于3个的客户查询代码和结果也如下图所示阶段详解1FROM阶段FROM dbo.Customers AS CLEFT OUTER JOIN dbo.Orders AS OON C.customerid O.customerid
步骤1-J1笛卡尔积这里先不考虑LEFT OUTER通过JOIN交叉联接后形成虚拟表VT1-J1步骤1-J2ON筛选器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筛选器但是也会被添加到虚拟表中。2WHERE阶段WHERE C.city Madrid
在此阶段会去掉VT1中客户为MRPHS的行因为其cityid不是Madrid生成如下所示的VT2ON和WHERE的区别WHERE对行的删除是最终的而ON对行的删除并不是因此步骤1-J3添加外部行时会再添加回来。此外只有当使用外连接时ON和WHERE才存在这种逻辑区别。3GROUP BY阶段GROUP BY C.customerid
这一步将VT2中的数据行按组进行重组得到VT3如下图所示4HAVING阶段HAVING COUNT(O.orderid) 3
这一步从VT3中进行筛选只有使得COUNT(O.orderid)3逻辑值为TRUE的组才会进入到VT4。HAVING筛选器是唯一可用于分组数据的筛选器。这里没有使用COUNT(*)是因为在外联接中COUNT(*)会把外部行也统计在内比如会将FISSA的订单数统计为1这明显是错误的。5SELECT阶段步骤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估计VT5VT5-1。6ORDER BY阶段ORDER BY numorders
这一步将对VT5进行排序返回游标VC6。ORDER BY子句也是唯一可以重用SELECT列表中创建的列别名的步骤。Ref参考资料[美] Itzik Ben-Gan 著《SQL Server 2008技术内幕T-SQL查询》????扫码关注EdisonTalk设为星标不再失联往期推文合集2020年上半年推文合集更多SQL文章每天10分钟T-SQL系列