1. 程式人生 > >Oracle select語句執行順序

Oracle select語句執行順序

最近在公司實習剛好需要用到oracle,作為之前沒有碰過oracle的我經常碰壁,而其中一個就是不是很瞭解其執行語句的順序,導致經常出現以下“靈異”的現象,比如用group by進行分組,結果出現多個相同的組,最後才發現是因為我在select裡使用了別名,而oracle的執行順序是先執行group by再執行select,所以分完組的結果又被做了一次處理導致原本不同的組最後展現出來變成一樣的。為了避免這種情況再次發生,查了些做了,並用自己的話寫處理以使自己能夠更好的理解相關的東西。

在oracle中select語句的基本結構如下:

[ WITH <common_table_expression>]
SELECT
[DISTINCT] [TOP_SEPCIFICATION] <select_list> [ INTO new_table ] FROM <table_source| <table_left> [JOIN_TYPE] JOIN <table_right> ON <join_condition> > [ WHERE <search_condition> ] [ GROUP BY <group_by_list> ] [ HAVING <search_condition> ] [ ORDER BY
order_expression [ ASC | DESC ] ]

其中[]中的部分為可選內容,另外其中的
[ WITH <common_table_expression>]
語句是用於新增其他sql行為的,例如你可以寫成
create <newtablename> as
來建立一個以之後的select語句檢索到的內容為表內容的新表。
而除此之外其他部分的執行順序如下所示:
(1)執行FROM語句,如果FROM之後接的是一個表則執行步驟(4),如果接的是一個JOIN語句則執行步驟(2);
(2)執行ON語句對ON之前的JOIN語句中兩個表進行裁剪(這樣可以避免直接進行JOIN得到全表的笛卡爾積而找出空間和時間的浪費);
(3)對(2)中裁剪得到的兩張表進行JOIN操作,得到一張聯合的表.如果之後還有其他JOIN語句則將得到的表作為table_left繼續進行步驟(2)的操作,否則進行步驟(4);
(4)執行WHERE語句,根據search_condition對之前步驟得到的表進行篩選;
(5)執行GROUP BY語句按照group_by_list對資料進行分組;
(6)執行HAVING語句對用GROUP BY 分組後的資料進行篩選,HAVING跟WHERE語句的區別在於WHERE一般用於對FROM語句得到的資料進行篩選,其中的篩選條件不能是聚合函式,而HAVING一般用於對GROUP BY語句處理後的資料進行篩選,可以使用聚合函式作為判斷條件;
(7)執行SELECT語句,對查詢到的欄位進行組織;
(8)使用DISTINCT對結果去重;
(9)使用ORDER BY 語句對結果進行排序;
(10)使用TOP指定要順暢前幾行的資料。