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開始或指定行位置篩選出指定數量的行。

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