SQLSERVER 2008 技術內幕 T-SQL查詢 筆記1: SQL 執行順序

與大多數語言同樣,SQL語言也有一個執行順序,只是在大多數編程語言中,代碼是按照編寫順序來處理的,而在SQL中則不是,下圖爲SQL 執行順序。express

(5) SELECT ( 5-2 ) [ ALL | DISTINCT ]
           (5- 3) [TOP ( expression ) [PERCENT] [ WITH TIES ]
           (5- 1) < select_list >
    --[ INTO new_table ]
(1) FROM ( 1-J ) < left_table> <join_type> join <right_table> on <on_predicate>
          |(1- A) <left_table> <apply_type > apply <right_table_expression> as <alias>
          |(1- P) <left_table> PIVOT (<pivot_specification>) as <alias>
          |(1- U) <left_table> UNPIVOT (<unpivot_specification>) as <alias>
(2) WHERE <search_condition>
(3) <GROUP BY>
(4) HAVING < search_condition > 
(6)    ORDER BY < order_by_list>

(1)FROM  FROM 階段標識出查詢的來源表,處理表運算符。每一個表運算符也會應用一系列子階段。例如,在聯接運算中涉及的階段是(1-J1)笛卡爾積、(1-J2)ON篩選器 和(1-J3) 添加外部行。 FROM 階段生成虛擬表 VT1編程

(1-J1) 笛卡爾積 這個階段對錶運算符涉及的兩個表執行笛卡爾積(交叉鏈接),生成虛擬表 VT1-J1app

(1-J2)ON 篩選器  這個除非對VT1-J1中的行根據ON子句(<on_predicate>)中出現的謂詞進行篩選。只有讓該謂詞取值爲true的行,才能插入 VT1-J2中編程語言

(1-J3)添加外部行  若是指定了OUTER JOIN(相對於cross join 或者 inner join ),則將保留表(preserved table) 中沒有找到匹配的行,做爲外部行添加到VT 1-J2中,生成 VT1- J3.spa

(2)WHERE  這個階段根據在 WHERE 子句中出現的謂詞(<where_predicate>)中對 VT1 中的行進行篩選。只有讓謂詞計算結果爲 TRUE 的行,才能插入 VT2 中。code

(3)GROUP BY 按照GROUP BY 子句中指定的列名列表,將 VT2 中的行進行分組,生成 VT3。最終,每一個分組只有一個結果行。blog

(4)HAVING 根據HAVING 子句中出現的謂詞(<having_predicate>) 對VT3中的分組進行篩選。只有讓謂詞計算結果爲TRUE的組,纔會插入到VT4排序

(5)SELECT 處理SELECT子句中的元素,產生VT5ci

(5-1) 計算表達式 計算SELECT 列中的表達式,生成 VT5-1it

(5-2) DISTINCT 刪除 VT5-1中的重複行,生成 VT5-2

(5-3)TOP 根據ORDER BY 子句定義的邏輯排序,從 VT5-2中選擇前面指定數量或百分比的行,生成表 VT5-3

(6) ORDER BY  根據 ORDER BY 子句中指定的列名列表,對 VT5-3中的行進行排序,生成遊標 VC6

相關文章
相關標籤/搜索