T-SQL查询处理的逻辑顺序
2010-05-25 10:45 ScriptZhang 阅读(445) 评论(0) 编辑 收藏 举报T-SQL 语法逻辑处理过程中,首先处理FROM子句,而SELECT子句的处理则放在最后,
SELECT 语句的基本组件
(8) SELECT (9) [DISTINCT]
(11) [TOP n] 返回结果列表 [INTO 新表名称]
(1) FROM 表
(3) [INNER |LEFT|RIGHT] JOIN 表(2) ON <表JOIN的条件>
(4) [WHERE <过滤条件>]
(5) [GROUP BY <分组语法>]
(6) [WITH {CUBE]ROLLUP}
(7) [HAVING <过滤条件>]
(10) [ORDER BY <排序列表> [ASC |DESC]]
Step 1:[FROM]
FROM 子句内可指定表名称,SQL SERVER 会列出SELECT 语句使用的表,若指定JOIN表则会一并列出,并通过交错排列的方式,将可能的组合放入VT1(第一个虚拟表)内.
表的来源有以下3种方式:
->本机执行的SQL Server 服务器上的基本或者连接表
->在SQL Server 本地实例中的视图或返回的表函数
->子查询
Step2:[ON]
比较VT1内的数据,当条件成立时将正确的数据插入VT2
Step3:[Outer(Join)]
如果定义了Outer JOIN而非CROSS JOIN 或 INNER JOIN ,保存的表VT2内没有相应的记录依然当作外部记录,从而形成了VT3,如果FROM子句中的表的个数超过2个,则Step1~3会在Join的执行结果与From 子句标记下一个表间重复执行,直到全部的表都处理完毕,
依然强调的是,这里讨论的是SELECT 逻辑上 执行架构,实际上,SQL Server 在执行JOin操作时,并不按用户编写的Join语法的先后顺序来执行,而是找出最佳的Join顺序并按其执行
Step4:[WHERE 过滤条件]
过滤VT3中的数据,将符合条件的列组成VT4
Step5:[Group BY]
GROUP by 子句可用于指定VT4的分组方式,执行结果生成VT5
Step6:[CUBE|ROLLUP]
CUBE|ROLLUP 子句会对Step5中己GROUP BY 的数据再做做进一步的GROUP BY 操作,如果将Step5比作计算数据的小计算,哪么Step6 就是计算数据的总计值,而产生的数据会插入VT6
Step7:[HAVING]
判断VT6完成的分组表的字段是否符合Having设置的条件,当符合条件时,会将其插入VT7
Step8:[SELECT]
通过SLECT 生成返回结果,仅选择符合要求的字段列表生成VT8
Step9:[DISTINCT]
移除VT8的重复数据记录,将结果插入VT9
Step10:[ORDER BY order_list [ASC\DESC]]
指定VT9的排序方式(递增或递减),并将排序后的数据插入VT10
Step11:[TOP]
使用TOP关键字,SQL Server 会将VT10中符合条件的前N条数据插入VT11,并返回给用户。
Step12:[返回结果列表]
指定返回项目(例如描述结果集的列,表态式,变量或变数),并以逗号分隔的列表。选择列表时通常会参考源表或视图的列,但也可以参考其它的任何表态式,例如常数或Transact-SQL函数
Step13:[INTO 新表名称]
可省略的自变量,方便用户以"返回结果列表"里的列表项目与数据类型结构新建的表,并可使用"新表名称"指定的表名称。