MySQL中SELECT的執行順序

天天在寫SELECT查詢,你知道SELECT的執行順序嗎?

通過下面這張圖可以知道SELECT的大概執行順序:
在這裏插入圖片描述
SELECT語句的完整語法爲:

(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_condition>
(10) LIMIT <limit_number>
-- 在語法面前的序號爲執行順序

MySQL的執行順序分爲十步,如上所標註的一樣,最先執行的是FROM操作,最後執行的是LIMIT操作。其中每一步操作都會產生一張虛擬的表,這個虛擬的表作爲一個處理的輸入,只不過這些虛擬的表對於用戶來說是透明的,只有最後的一張表纔會當作結果進行返回。如果沒有在語句中指定某個子句,則會跳過相應的步驟。

接下來分析一下查詢語句的每一個階段:

SELECT a.customer_id, COUNT(b.order_id) as total_orders
FROM table1 AS a
LEFT JOIN table2 AS b
ON a.customer_id = b.customer_id
WHERE a.city = 'hangzhou'
GROUP BY a.customer_id
HAVING count(b.order_id) < 2
ORDER BY total_orders DESC;

1:FORM: 對FROM左邊的表和右邊的表計算笛卡爾積,產生虛表VT1。
2:ON:ON: 對虛表VT1進行ON過濾,只有那些符合<join-condition>的行纔會被記錄在虛表VT2中。
3:JOIN:如果指定了OUTER JOIN(比如LEFT JOIN、RIGHT JOIN),那麼保留表中未匹配的行就會作爲外部行添加到虛擬表VT2中,產生虛擬表VT3。
4:WHERE:對虛擬表VT3進行WHERE條件過濾操作,只有符合<where_condition>的記錄纔會被插入到虛擬表VT4中。
5:GROUO BY:根據GROUO BY子句中的列,對VT4中的操作進行分組操作,產生VT5。
6:HAVING:對虛擬表VT5應用HAVING過濾,只有符合<having_condition>的記錄纔會被插入到虛擬表VT6中。
7:SELECT:執行SELECT操作,選擇指定的列,插入到VT7中。
8:DISTINCT:對虛擬表VT7中的數據進行去重處理產生VT8。
9:ORDER BY:對虛擬表VT8中的記錄按照<order_by_condition>進行排序,產生虛擬表VT9。
10:LIMIT:取出指定行的記錄,產生虛擬表VT10, 並將結果返回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章