代码改变世界

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 新表名称]

可省略的自变量,方便用户以"返回结果列表"里的列表项目与数据类型结构新建的表,并可使用"新表名称"指定的表名称。