注:sql server 不一樣於其餘編程預言的最明顯特徵是處理代碼的順序。sql
每一個步驟都會產生一個虛擬表,該虛擬表被用做下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只有最後一步生成的表纔會返回給調用者。若是沒有在查詢中指定某一子句,將跳過相應的步驟。編程
1》FROM:對from子句中前兩個表執行笛卡爾積(交叉聯接 ),生成虛擬表VT1;server
2》ON :對VT1應用on篩選器。只有那些使ON篩選條件爲真的行才被插入VT2;排序
3》OUTER(JOIN):若是指定了OUTER JOIN (相對與CROSS JOIN或者INNER JOIN),保留表中未找到匹配的行將做爲外部行添加到VT2,生成VT3;若是FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3;只處處理完全部的表爲止;select
4》WHERE:對VT3應用WHERE篩選器,只有使WHERE篩選條件爲TRUE的行才被插入VT4;程序
5》GROUP BY:按group by子句中的列列表對VT中的行分組,生成VT5;im
6》CUBE|ROLLUP:把超組插入VT5,生成VT6;客戶端
7》HAVING:對VT6應用having篩選器,只有使條件爲TRUE的組才被插入VT7;查詢
8》SELECT:處理select列表,生成VT8;img
9》DISTINCT:將重複的行從VT8中移除,生成VT9;
10》ORDER BY:將VT9中的行按order by子句中的列列表排序,生成一個遊標 (VC10);
11》TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回給調用者。