大話oracle子句的執行順序

oracle子句的執行順序oracle

 

一個SQL會包含不少個子句,在寫SQL時,理解SQL個部分子句執行的優先級很是重要,不然可能會致使簡單的SQL變成多個嵌套的SQL,更可能致使錯誤的返回結果。ide

下面經過一個例子說明各子句的優先級:函數

 

select a,b,count(sum(c)) over ()spa

from tit

where t.d=1io

start with e is not null connect by prior f=gclass

group by a,bselect

having sum(c)>100數據

order by 3;margin

 

這個SQL包含:

1. SELECT 子句

2. group by子句

3. 分析函數

4. from子句

5. where子句

6. start with...connect by子句

7. having子句

8. order by子句

 

對於FROM子句,能夠簡單理解爲表或者掃描掃描(若是涉及到多表關聯就複雜了,這裏不討論);

對於SELECT子句,從執行計劃看是在最後執行的,我把它理解爲返回數據給用戶,而不是讀取數據,讀取數據是在FROM這個步驟執行的,因此我認爲順序是:

 

4 -> 6 -> 5 -> 2 -> 7 -> 3 -> 8 -> 1

 

from子句 -> start with...connect by子句 -> where子句 -> group by子句 -> having子句 -> 分析函數 -> order by子句 -> SELECT 子句

 

要注意,以上的順序只表明通常狀況,不必定全部的狀況都按照這個執行順序,尤爲是同時有group by和order by時。例如:

 

select a,b,count(sum(c)) over ()

from t

where t.d=1

start with e is not null connect by prior f=g

group by a,b

having sum(c)>100

order by a;

 

這個SQL的執行順序就有多是:4->6->5-> 2 + 8 ->7->3->1。實際執行順序以執行計劃爲準,可是這裏特別要記住的是無論SQL怎麼樣,如下部分的優先級是肯定的:

 

start with...connect by子句 -> where子句 -> group by子句 -> having子句 -> 分析函數

相關文章
相關標籤/搜索