1. 程式人生 > >sql 語句的執行順序

sql 語句的執行順序

sql是宣告性語言:

首先要把這個概念記在腦中:“宣告”。 SQL 語言是為計算機聲明瞭一個你想從原始資料中獲得什麼樣的結果的一個範例,而不是告訴計算機如何能夠得到結果。

SQL 語言宣告的是結果集的屬性,計算機會根據 SQL 所宣告的內容來從資料庫中挑選出符合宣告的資料,而不是像傳統程式設計思維去指示計算機如何操作。

 

查詢語句中select from where group by having order by的執行順序   1.查詢中用到的關鍵詞主要包含六個,並且他們的順序依次為  SELECT[DISTINCT]--from--where--group by--having--UNION--order by    其中select和from是必須的,其他關鍵詞是可選的,這六個關鍵詞的執行順序  與sql語句的書寫順序並不是一樣的,而是按照下面的順序來執行  from--where--group by--having--select--DISTINCT--UNION--order by,  from:需要從哪個資料表檢索資料  where:過濾表中資料的條件  group by:如何將上面過濾出的資料分組  having:對上面已經分組的資料進行過濾的條件   select:檢視結果集中的哪個列,或列的計算結果  order by :按照什麼樣的順序來檢視返回的資料    2.from後面的表關聯,是自右向左解析的  而where條件的解析順序是自下而上的。    也就是說,在寫SQL文的時候, 儘量把資料量小的表放在最右邊來進行關聯
,  而把能篩選出大量資料的條件放在where語句的最下面。     SQL Select語句完整的 執行順序【從DBMS使用者角度】: 
  1、from子句組裝來自不同資料來源的資料; 
  2、where子句基於指定的條件對記錄行進行篩選; 
  3、group by子句將資料劃分為多個分組; 
  4、使用聚集函式進行計算; 
  5、使用having子句篩選分組; 
  6、計算所有的表示式; 
  7、使用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)作為基礎表, 交叉表是指被其他表所引用的表

多表連線時,使用表的別名並把別名字首於每個Column上。可以減少解析的時間並減少那些由Column 歧義引起的語法錯誤.

 

where子句--執行順序為自下而上、從右到左

ORACLE 採用自下而上從右到左的順序解析Where 子句,根據這個原理,表之間的連線必須寫在其他Where 條件之前, 可以過濾掉最大數量記錄的條件必須寫在Where 子句的末尾。

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子句--執行順序為從左到右排序,很耗資源   以上都是參考下面兩篇文章,紅字部分是做的改動  有不正確的地方   望指正。 參考:https://www.cnblogs.com/huminxxl/p/3149097.html https://blog.csdn.net/u011277123/article/details/54691260/