乙個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
h**ing sum(c)>100
order by 3;
這個sql包含:
1. select 子句
2. group by子句
3. 分析函式
4. from子句
5. where子句
6. start with...connect by子句
7. h**ing子句
8. order by子句
對於from子句,可以簡單理解為表或者掃瞄掃瞄(如果涉及到多表關聯就複雜了,這裡不討論);
對於select子句,從執行計畫看是在最後執行的,我把它理解為返回資料給使用者,而不是讀取資料,讀取資料是在from這個步驟執行的,所以我認為順序是:
4 -> 6 -> 5 -> 2 -> 7 -> 3 -> 8 -> 1
from子句 -> start with...connect by子句 -> where子句 -> group by子句 -> h**ing子句 -> 分析函式 -> 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
h**ing sum(c)>100
order by a;
這個sql的執行順序就有可能是:4->6->5-> 2 + 8 ->7->3->1。實際執行順序以執行計畫為準,但是這裡特別要記住的是不管sql怎麼樣,以下部分的優先順序是確定的:
start with...connect by子句 -> where子句 -> group by子句 -> h**ing子句 -> 分析函式
SQl語句執行順序
在程式設計的時候,每個語言的一行 都是有執行順序,比如從右往左或者從左往右,在大部分的時候是不影響,但有些時候,執行順序卻有非常大的影響。int i 0 if i 0 i 0 if i 0 i 0 第一種情況會執行,第二種情況不會執行,因為判斷是從右往左判斷,條件不成立馬上就結束,第二種情況先判斷i...
SQL語句執行順序
1 from 子句,組裝來自不同資料來源的資料 2 where 子句,基於指定的條件對記錄進行篩選 3 group by 子句,將資料劃分為多個分組 4 使用聚合函式進行計算 5 使用 h ing 子句篩選分組 6 計算所有的表示式 7 使用 order by 對結果集進行排序 select dis...
SQL語句執行順序
from或join會第乙個執行,確定乙個整體的資料範圍.如果要join不同表,可能會生成乙個臨時table來用於 下面的過程。總之第一步可以簡單理解為確定乙個資料來源表 含臨時表 我們確定了資料 where語句就將在這個資料來源中按要求進行資料篩選,並丟棄不符合要求的資料行,所有的篩選col屬性 只...