(5)SELECT (5-2) DISTINCT(5-3)TOP(top_specification>)(5-1) select_list>
(1)FROM (1-J) left_table> join_type> JOIN right_table> on on_predicate>
(2)WHERE where_predicate>
(3)GROUP BY group_by_specification>
(4)HAVING having_predicate>
(6)ORDER BY order_by_list>;
每一步都會生成一個虛擬表,該虛擬表會作為下一步的輸入。這些虛擬表對于調(diào)用者是不可用的,只有最后一步生成的虛擬表才會返回給調(diào)用者。如果在查詢中沒有指定某一個子句,則會跳過相應(yīng)的步驟。接下來就簡單地描述一下這些不同的邏輯步驟。
(1)FROM FROM階段標(biāo)識出查詢的來源表,處理表運算符,每個表運算符也會應(yīng)用一系列子階段。例如,在聯(lián)接運算中涉及的階段是(1-J1)笛卡爾積、(1-J2)ON篩選器和(1-J3)添加外部行。FROM階段生成虛擬表VT1。
(1-J1)笛卡爾積 這個階段對表運算符涉及的兩個表執(zhí)行笛卡爾積(交叉聯(lián)接),生成虛擬表VT1-J1。
(1-J2)ON篩選器 這個階段對VT1-J1中的行根據(jù)ON子句中出現(xiàn)的謂語進(jìn)行篩選。只有讓該謂語取值為TRUE的行,才能插入VT1-J2中。
(1-J3)添加外部行 如果指定了OUTER JOIN(相對于CROSS JOIN 或 INNER JOIN),則將保留表(preserved table)中沒有找到匹配的行,作為外部行添加到VT1-J2中,生成VT1-J3。
(2)WHERE 這個階段根據(jù)在WHERE子句中出現(xiàn)的謂語(where_predicate>)對于VT1中的行進(jìn)行篩選。只有讓謂語計算結(jié)果為TRUE的行,才會插入VT2中。
(3)GROUP BY 按照GROUP BY子句中指定的列名列表,將VT2中的行進(jìn)行分組,生成VT3。
(4)HAVING 根據(jù)HAVING子句中出現(xiàn)的謂語(having_predicate>)對VT3中的分組進(jìn)行篩選。只有讓謂語計算結(jié)果為TRUE的組,才會插入到VT4。
(5)SELECT 處理SELECT子句中的元素,生成VT5。
(5-1)計算表達(dá)式 計算SELECT列表中的表達(dá)式,生成VT5-1。
(5-2)DISTINCT 刪除VT5-1中的重復(fù)行,生成VT5-2。
(5-3)TOP 根據(jù)ORDER BYi子句定義的邏輯排序,從VT5-2中選擇前面指定數(shù)量或百分比的行,生成表VT5-3。
(6)ORDER BY 根據(jù)ORDER BY子句中指定的列名列表,對VT5-3中的行進(jìn)行排序,生成游標(biāo)VC6。
以上就是一個完整的T-SQL語句的執(zhí)行過程,希望能給大家?guī)椭?/P>
以上內(nèi)容摘自《Microsoft SQL Server 2008技術(shù)內(nèi)幕 T-SQL查詢》一書。
您可能感興趣的文章:- SQL語句執(zhí)行順序圖文介紹
- SQL Select語句完整的執(zhí)行順序
- SQL語句執(zhí)行順序詳解
- SQLServer中SELECT語句的執(zhí)行順序
- sql和MySQL的語句執(zhí)行順序分析
- SQL語句的執(zhí)行原理分析
- SQL語句執(zhí)行深入講解(MySQL架構(gòu)總覽->查詢執(zhí)行流程->SQL解析順序)