select 語句的執行順序排序
借用ItZik Ben-Gan、Lubor Kollar、Dejan Sarka所著的《Sql Server 2005 技術內幕:T-SQL查詢》的一段話足以說明:ci
(8) select (9) distinct (11) <top_specification > <select_list>it
(1)from<lef t_table>io
(3) <join_type> join <right_table>table
(2) on <join _condition>基礎
(4) where <where_condition>select
(5)group by <group_by_list>rollup
(6) with {cube|rollup}引用
(7)having(having_condition)技術
(10) order by <order_by_condition>
從這個順序能夠看出,全部的查詢語句都是從from開始執行的。在執行過程當中,每一個步驟都會爲下一個步驟生成一個虛擬表,這個虛擬表將做爲下一個執行步驟的基礎。
第一步:from
首先對from子句中的前兩個表執行一個笛卡爾乘積,此時生成虛擬表vt1 .
第二步:on
接下來即是應用on篩選器,on 中的邏輯表達式將應用到 vt1 中的各個行,篩選出知足on邏輯表達式的行,生成虛擬表 vt2 .
第三步:join
若是是outer join 那麼這一步就將添加外部行,left outer jion 就把左表在第二步中過濾的添加進來,若是是right outer join 那麼就將右表在第二步中過濾掉的行添加進來,這樣生成虛擬表 vt3.
第四步:多表
若是 from 子句中的表數目多餘兩個表,那麼就將vt3和第三個錶鏈接從而計算笛卡爾乘積,生成虛擬表,該過程就是一個重複1-3的步驟,最終獲得一個新的虛擬表 vt3.
第五步:where
應用where篩選器,對上一步生產的虛擬表引用where篩選器,生成虛擬表vt4,在這有個比較重要的細節不得不說一下,對於包含outer join子句的查詢,就有一個讓人感到困惑的問題,到底在on篩選器仍是用where篩選器指定邏輯表達式呢?on和where的最大區別在於,若是在on應用邏輯表達式那麼在第三步outer join中還能夠把移除的行再次添加回來,而where的移除的最終的。
第六步:group by
分組,生成虛擬表 vt4
第七步:having
對vt4應用having篩選器,生成虛擬表 vt5
第八步:select
處理select 列表,生成虛擬表vt6
第九步:distinct
將vt6 中重複的行去掉,生成虛擬表vt7
第十步:order by
將vt7中的行按order by 子句中的列列表排序,生成一個遊標vc8
第十一步:top
從vc8的開始處選擇指定數量或比例的行,生成虛擬表vt9,並返回給調用者