一:查詢的邏輯執行順序
(1) FROM < left_table>
(3) < join_type> JOIN < right_table> (2) ON < join_condition>
(4) WHERE < where_condition>
(5) GROUP BY < group_by_list>
(6) WITH {cube | rollup}
(7) HAVING < having_condition>
(8) SELECT (9) DISTINCT (11) < top_specification> < select_list>
(10) ORDER BY < order_by_list>
標準的SQL 的解析順序為:
(1).FROM 子句 組裝來自不同資料來源的資料
(2).WHERE 子句 基於指定的條件對記錄進行篩選
(3).GROUP BY 子句 將資料劃分為多個分組
(4).使用彙總函式進行計算
(5).使用HAVING子句篩選分組
(6).計算所有的運算式
(7).使用ORDER BY對結果集進行排序
二 執行順序:
1.FROM:對FROM子句中前兩個表執行笛卡爾積產生虛擬表vt1
2.ON:對vt1表應用ON篩選器只有滿足< join_condition> 為真的行才被插入vt2
3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 產生t3如果from包含兩個以上表則對上一個連接產生的結果表和下一個表重複執行步驟和步驟直接結束
4.WHERE:對vt3應用 WHERE 篩選器只有使< where_condition> 為true的行才被插入vt4
5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組產生vt5
6.CUBE|ROLLUP:把超組(supergroups)插入vt6 產生vt6
7.HAVING:對vt6應用HAVING篩選器只有使< having_condition> 為true的組才插入vt7
8.SELECT:處理select列表產生vt8
9.DISTINCT:將重複的行從vt8中去除產生vt9
10.ORDER BY:將vt9的行按order by子句中的列列表排序產生一個遊標vc10
11.TOP:從vc10的開始處選擇指定數量或比例的行產生vt11 並返回調用者
看到這裡,那麼用過linqtosql的文法有點相似啊?如果我們我們瞭解了sqlserver執行順序,那麼我們就接下來進一步養成日常sql好習慣,也就是在實現功能同時有考慮效能的思想,資料庫是能進行集合運算的工具,我們應該盡量的利用這個工具,所謂集合運算實際就是批量運算,就是盡量減少在用戶端進行大資料量的迴圈操作,而用SQL語句或者預存程序代替。