MySQL Select 語句執行順序

一條 SQL 查詢語句結構如下:

SELECT 
DISTINCT <select_list>
FROM <left_table> <join_type> JOIN <right_table> ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

但真正的執行步驟如下,執行時,每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入:

1. FROM

在這一步,無論後面跟那種聯接運算(LEFT JOIN、RIGHT JOIN等),都首先執行交叉聯接(CROSS JOIN),計算笛卡爾積,生成虛擬表 VT-1

2. ON

根據 ON 的篩選條件對 VT-1 進行篩選,生成 VT-2

3. JOIN

如果指定了OUTER JOIN(如 LEFT JOIN、RIGHT JOIN),將上一步沒有匹配的行添加到 VT-2,生成 VT-3。例如 LEFT JOIN 會將左表的剩餘數據添加到 VT-2 中

如果 FROM 子句包含兩個以上表,則這一步最後生成的虛表 VT-3 和 FROM 子句的下一個表重複依次執行前述三個步驟,直到處理完所有的表爲止

4. WHERE

根據條件對 VT-3 進行篩選,條件成立的行插入 VT-4

5. GROUP BY

按照指定的列名對 VT-4 的行進行分組,生成VT-5,最後每個分組只有一行

6. HAVING

使用聚合函數對 VT-5 的分組進行篩選,生成 VT-6

7. SELECT

投影獲取指定的列,如有表達式則計算,生成 VT-7

8. DISTINCT

數據除重,生成 VT-8

9. ORDER BY

根據 ORDER BY 子句中指定的列排序,生成 VT-9

10. LIMIT

取出指定行的記錄,產生 VT-10,並返回給查詢用戶

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