select 語句的執行順序

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,並返回給調用者

相關文章
相關標籤/搜索