一條 SQL 查詢語句結構如下: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY < ...
一條 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,並返回給查詢用戶