SQL語句各子句的執行順序


一個SQL會包含很多個子句,在寫SQL時,理解SQL個部分子句執行的優先級非常重要,否則可能會導致簡單的SQL變成多個嵌套的SQL,更可能導致錯誤的返回結果。

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

 


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 3;

這個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子句 -> 分析函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM