天天看點

MySQL的sql執行順序

在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<limit_number>

1、FROM:對FROM左邊的表和右邊的表計算笛卡爾積,産生虛表VT1;

2、ON:對虛拟表VT1進行ON篩選,隻有那些符合<join_condition>條件的行才會被記錄在虛拟表VT2中;

3、JOIN:如果是OUT JOIN,那麼将保留表中(如左表或者右表)未比對的行作為外部行添加到虛拟表VT2中,進而産生虛拟表VT3;

4、WHERE:對虛拟表VT3進行WHERE條件過濾,隻有符合<where_condition>的記錄才會被放入到虛拟表VT4;

5、GROUP BY:根據GROUP BY子句中的列,對虛拟表VT4進行分組操作,産生虛拟表VT5;

6、CUBE|ROLLUP:對虛拟表VT5進行CUBE或者ROLLUP操作,産生虛拟表VT6;

7、HAVING:對虛拟表VT6進行HAVING條件過濾,隻有符合<having_condition>的記錄才會被插入到虛拟表VT7中;

8、SELECT:執行SELECT操作,選擇指定的列,插入到虛拟表VT8中;

9、DISTINCT:對虛拟表VT8中的記錄進行去重,産生虛拟表VT9;

10、ORDER BY:将虛拟表VT9中的記錄按照<order_by_list>進行排序操作,産生虛拟表VT10;

11、LIMIT:取出指定行的記錄,産生虛拟表VT11,并将結果傳回。