SELECT查询的逻辑处理

select 语句的语法如下:

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

  2. ON

  3. JOIN

  4. WHERE

  5. GROUP BY

  6. WITH CUBE or WITH ROLLUP

  7. HAVING

  8. SELECT

  9. DISTINCT

  10. ORDER BY

  11. 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开始或指定行位置筛选出指定数量的行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章