查詢的邏輯執行順序sql
(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 (9) ORDER BY order_by_list
標準的 SQL 函數
① 解析順序:
(1) FROM 子句 組裝來自不一樣數據源的數據
(2) WHERE 子句 基於指定的條件對記錄進行篩選
(3) GROUP BY 子句 將數據劃分爲多個分組
(4) 使用聚合函數進行計算
(5) 使用HAVING子句篩選分組
(6) 計算全部的表達式
(7) 使用ORDER BY對結果集進行排序spa
② 執行順序
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 並返回調用者code
SQL語句規範orm
1. 只返回須要的數據排序
A. 橫向來看ci
(1) 不要寫SELECT * 的語句,而是選擇你須要的字段。it
(2)當在SQL語句中鏈接多個表時, 請使用表的別名並把別名前綴於每一個Column上。這樣一來,就能夠減小解析的時間並減小那些由Column歧義引發的語法錯誤。io
B. 縱向來看table
(1) 合理寫WHERE子句,不要寫沒有WHERE的SQL語句。
(2)SELECT TOP N * -- 沒有WHERE條件的用此替代。