您的位置:首页 > 其它

SELECT查询的逻辑处理

2016-01-24 11:39 260 查看
select 语句的语法如下:



各个子句的执行顺序如下:

FROM

ON

JOIN

WHERE

GROUP BY

WITH CUBE or WITH ROLLUP

HAVING

SELECT

DISTINCT

ORDER BY

TOP

详细的处理逻辑如下:

(1)FROM,ON,JOIN

该步骤中用于验证查询的源表,并处理表操作符。每个表操作符应用于一系列子步骤。

执行left_table和right_table两个表的交叉联接(笛卡尔积),生成虚拟表VT1-J1
对笛卡尔积应用ON筛选器,生成虚拟表VT1-J2。(在此过程中,null与其他值(也包含null)将返回unknown,只有返回为true的才能保留)(如果ANSI_NULLS
选项设置为OFF时,null=null将返回true)
查看join类型,如果是外部联接,那么将在上面步骤筛选掉的外部行重新添加到VT1-J2,从而生成VT1-J3。如果其他联接,则跳过此步骤。
最终将生成虚拟表VT1.

可以看出cross join只执行第一步骤,而inner join则执行第一和第二步骤,而outer join则执行了三个步骤。
(2)WHERE
对VT1应用where筛选器,生成虚拟表VT2.
(3)GROUP
BY,WITH CUBE or WITH ROLLUP
按GROUP BY子句中的列表对VT2中的行进行分组,生成VT3,如果语句中包含WITH CUBE或者WITH ROLLUP,则将分组统计结果再次加总后插入VT3,生成VT3-RC。(注意:WITH CUBE or WITH ROLLUP不属于ISO标准,应使用 GROUP
BY CUBE (a1, ..., a13) 和GROUP BY ROLLUP (a1, ..., a13))
(4)HAVING
对VT3应用HAVING筛选器,符合筛选条件的行生成VT4.
(5)SELECT ,DISTINCT
处理select子句中的元素,生成VT5,注意子句中的元素是没有顺序的,这意味着别名不能用于其他元素。

计算表达式:该步骤计算select列表中的表达式,生成VT5-1,
DISTINCT:从VT5-1剔除重复行,生成VT5-2

(6)ORDER
BY
该步骤对于VT5-2中的行按照ORDER
BY子句中的列表进行排序,生成一个游标VC6(集合与游标不同,集合是没有顺序的)
(7)TOP 或OFFSET/FETCH
该步骤根据ORDER BY子句中指定的排序规则,从VC6开始或指定行位置筛选出指定数量的行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: