1. 程式人生 > 實用技巧 >Mysql各關鍵字的邏輯執行順序

Mysql各關鍵字的邏輯執行順序

Mysql各關鍵字的邏輯執行順序

下面的執行順序只是一種邏輯順序,由於Mysql優化器的作用,實際情況可能略有不同。使用explain語句可以分析sql語句的執行順序,但也不保證準確性。

(8)     SELECT (9) 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)     WITH {CUBE|ROLLUP}
(7)     HAVING <having_condition>
(10)    ORDER BY <order_by_list>
(11)    LIMIT <offset,limit_number>

1、from 執行笛卡爾乘積

對from子句中的左表<left_table>和右表<right_table>執行笛卡爾積,得到虛擬表VT1。

2、on 應用On過濾器

對前面生成的虛擬表VT1進行ON篩選,符合條件的會被記錄到虛擬表VT2中。

3、join 新增外部行

這一步只有在連線型別為Outer join時才發生,如Left Outer joinRight Outer joinFull Outer join等,left outer join的保留表時左表,right outer join的保留表是右表,full outer join左右兩個表都是保留表,新增外部行就是在VT2表的基礎上新增新增保留表中被過濾條件過濾掉的資料,非保留表中的的資料被賦予null值

,最後生成虛擬表VT3。

4、where 應用where過濾器

對步驟3產生的虛擬表VT3進行過濾,只有符合條件<where_condition>的記錄才會插入新的虛擬表VT4。

5、group by 分組

根據group by子句中的列,對步驟4的記錄進行分組操作得到虛擬表VT5。

6、with 應用ROLLUP或CUBE

如果指定了ROLLUP選項,將建立一個額外的記錄新增到虛擬表VT5的最後,並生成虛擬表VT6。mysql不支援CUBE。

7、應用HAVING過濾器

對上一步產生的虛擬表應用Having過濾器

8、處理Select列表

將Select中指定的列從上一步產生的虛擬表中選出。

9、應用Distinct子句

如果在查詢中指定了distinct子句,則會建立一張記憶體臨時表,並對distinct操作的列增加了唯一索引,以此來去除重複資料。

10、應用Order by子句

根據order by指定的列對上一步輸出的虛擬表進行排列,返回新的虛擬表。

11、Limit子句

從上一步的虛擬表中選出指定位置開始的指定行資料。

參考自Mysql技術內幕:SQL程式設計