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开始或指定行位置筛选出指定数量的行。
各个子句的执行顺序如下:
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开始或指定行位置筛选出指定数量的行。
相关文章推荐
- 51nod 1050 循环数组最大子段和
- Android自定义dialog中的EditText无法弹出键盘的解决
- 本地搭建ELK系统
- The Castle
- python优秀网友学习笔记推荐
- 新浪云+七牛云实现 Mysql + Servlet + Jsp 使用记录
- PHP验证码生成原理和实现
- OpenStreetMap地图数据介绍(转)
- BigTable原理
- HDU 1037 Keep on Truckin'
- POJ3159(最短路)
- C# 窗口最大化但不占用任务栏位置
- html5与html4的区别
- 树套树【bzoj3262】陌上花开
- 张江男的逆袭,我如何使用leangoo提升团队效率
- 数据结构实验之栈三:后缀式求值
- 侧边栏增强版
- UILabel---.tff格式字体
- 实现文本、数字、英文字母自动换行!
- struts2初探