1. 程式人生 > >SQL執行順序說明

SQL執行順序說明

很多時候,有些人不能很清楚的說明和理解SQL執行順序。故今天整理說明下。

首先羅列的是常用標準的SQL查詢語句。其中括號裡面的數字說的是SQL執行順序,從1開始。

 ( 7 )  SELECT

 ( 8 )  DISTINCT <select_list>
 ( 1  ) FROM <left_table>
 ( 3  )  <join_type> JOIN <right_table> 

 ( 2 )   ON <join_condition> 

 ( 4  ) WHERE <where_condition>

 ( 5 ) GROUP BY <group_by_list>

 ( 6 ) HAVING <having_condition> 

  ( 9 ) ORDER BY <order_by_list>

  ( 10 ) LIMIT <limit_number> 

執行順序說明如下:

1:FROM :對於FROM 子句中的前兩個表執行笛卡爾積操作。生成虛擬表V1。在這裡需要注意的是有的時候因為表的表名過長。很多人喜歡用別名來代替。如T1, 也有的時候把一個表的部分結果集拿出來作為連線表。如  (select distinct id  from  t1 where  rdate >='20130101' ) t2,這些經常見於多表關聯。為避免mysql的子查詢來進行的低效率來做多表JOIN操作,所以會出現先生成子表的結果後,才開始進行關聯;

2:ON : 對V1應用ON過濾器。只有哪些符合<join_condition>條件為真的行記錄才被插入到V2;

3:  JOIN : 如果制定了外連線(OUT JOIN)(相對於 (CROSS JOIN)或者 (INNER JOIN),保留表:(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行新增到 V2,生成V3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表為止;

4:WHERE: 對於V3應用WHERE過濾器。只有符合

<where_condition>條件為TRUE的行才被插入到V4。這裡面有個SQL中的ON和WHERE 的區別。可以檢視我過去的一篇ON和WHERE的區別使用;

5:GROUP BY : 按照GROUP BY 子句中的列對V4中的行進行分組。生成V5;

6:HVAING: 對V5應用HVAING過濾器。只用使 <having_condition> 為TRUE的組才會被插入到V6,至於HAVING如何用和GROUP BY的關係,大家懂的。就不多說了。

7:SELECT : 處理SELECT 列表,產生V7,這裡可以進行各種組成處理,列欄位計算,如果COUNT(),字串函式處理,集合處理等生成V7;

8:DISTINCT :對重複的行從V7中去掉。產生V8, 這裡需要注意的是SELECT 的時候DISTINCT和欄位的位置。不同的位置產生的結果是不同的。

9: ORDER BY:將V8中的行按照 ORDER BY 子句中的列表順序排序。生成遊標V9,在這裡需要注意的是。可用使用SELECT 列表中的列的別名。如 SELECT 語句中的 SELECT LENGTH(NAME) AS  LNAME FROM  TABLENAME。 在 ORDER BY 裡面就可以用 ORDER BY LNAME DESC 進行排序。這裡返回的是一個遊標集合。但是使用了ORDER BY 子句的查查不能用作表表達式。 

10:LIMIT: 從V9中選擇需要的記錄行。返回給客戶端。至於如何高效的選擇LIMIT查詢,就不多說。