一、from子句組裝來自不一樣數據源的數據;
二、where子句基於指定的條件對記錄行進行篩選;
三、group by子句將數據劃分爲多個分組;
四、使用匯集函數進行計算;
五、使用having子句篩選分組;
六、計算全部的表達式;
七、使用order by對結果集進行排序。
SQL Select語句的 執行步驟【從DBMS實現者角度,這個對咱們用戶意義不大】:
1)語法分析,分析語句的語法是否符合規範,衡量語句中各表達式的意義。
2) 語義分析,檢查語句中涉及的全部數據庫對象是否存在,且用戶有相應的權限。
3)視圖轉換,將涉及視圖的查詢語句轉換爲相應的對基表查詢語句。
4)表達式轉換, 將複雜的 SQL 表達式轉換爲較簡單的等效鏈接表達式。
5)選擇優化器,不一樣的優化器通常產生不一樣的「 執行計劃」
6)選擇鏈接方式, ORACLE 有三種鏈接方式,對多表鏈接 ORACLE 可選擇適當的鏈接方式。
7)選擇鏈接 順序, 對多表鏈接 ORACLE 選擇哪一對錶先鏈接,選擇這兩表中哪一個表作爲源數據表。
8)選擇數據的搜索路徑,根據以上條件選擇合適的數據搜索路徑,如是選用全表搜索仍是利用索引或是其餘的方式。
9)運行「 執行計劃」。
from 子句--執行順序爲從後往前、從右到左
表名(最後面的那個表名爲驅動表,執行順序爲從後往前, 因此數據量較少的表儘可能放後)數據庫
oracle 的解析器按照從右到左的順序處理,FROM 子句中的表名,FROM 子句中寫在最後的表(基礎表 driving table)將被最早處理,即最後的表爲驅動表,在FROM 子句中包含多個表的狀況下,你必須選擇記錄條數最少的表做爲基礎表。若是有3 個以上的錶鏈接查詢, 那就須要選擇交叉表(intersection table)做爲基礎表, 交叉表是指被其餘表所引用的表oracle
多表鏈接時,使用表的別名並把別名前綴於每一個Column上。能夠減小解析的時間並減小那些由Column 歧義引發的語法錯誤.函數
▼post
▼優化
where子句--執行順序爲自下而上、從右到左對象
ORACLE 採用自下而上從右到左的順序解析Where 子句,根據這個原理,表之間的鏈接必須寫在其餘Where 條件以前, 能夠過濾掉最大數量記錄的條件必須寫在Where 子句的末尾。blog
▼排序
▼索引
group by--執行順序從左往右分組
提升GROUP BY 語句的效率, 能夠經過將不須要的記錄在GROUP BY 以前過濾掉。即在GROUP BY前使用WHERE來過慮,而儘可能避免GROUP BY後再HAVING過濾。
▼
▼
having 子句----很耗資源,儘可能少用
避免使用HAVING 子句, HAVING 只會在檢索出全部記錄以後纔對結果集進行過濾. 這個處理須要排序,總計等操做.
若是能經過Where 子句在GROUP BY前限制記錄的數目,那就能減小這方面的開銷.
(非oracle 中)on、where、having 這三個均可以加條件的子句中,on 是最早執行,where 次之,having 最後,由於on 是先把不符合條件的記錄過濾後才進行統計,它就能夠減小中間運算要處理的數據,按理說應該速度是最快的,
where 也應該比having 快點的,由於它過濾數據後才進行sum,在兩個表聯接時才用on 的,因此在一個表的時候,就剩下where 跟having比較了。
在這單表查詢統計的狀況下,若是要過濾的條件沒有涉及到要計算字段,那它們的結果是同樣的,只是where 可使用rushmore 技術,而having 就不能,在速度上後者要慢。
若是要涉及到計算的字段,就表示在沒計算以前,這個字段的值是不肯定的,where 的做用時間是在計算以前就完成的,而having 就是在計算後才起做用的,因此在這種狀況下,二者的結果會不一樣。
在多表聯接查詢時,on 比where 更早起做用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where 進行過濾,而後再計算,計算完後再由having 進行過濾。
因而可知,要想過濾條件起到正確的做用,首先要明白這個條件應該在何時起做用,而後再決定放在那裏。
▼
▼select子句--少用*號,儘可能取字段名稱。
ORACLE 在解析的過程當中, 會將依次轉換成全部的列名, 這個工做是經過查詢數據字典完成的, 使用列名意味着將減小消耗時間。
sql 語句用大寫的;由於 oracle 老是先解析 sql 語句,把小寫的字母轉換成大寫的再執行
▼
▼order by子句--執行順序爲從左到右排序,很耗資源