SQL 查詢的邏輯處理順序(即 SQL 引擎解析和執行查詢的順序)與書寫順序不同。以下是 SQL 查詢的完整執行順序:
1. 邏輯執行順序
-
FROM?和 JOIN - 確定數據來源表并執行連接操作
-
WHERE?- 對行進行篩選
-
GROUP BY?- 將數據分組
-
HAVING?- 對分組結果進行篩選
-
SELECT?- 選擇要返回的列
-
DISTINCT?- 去除重復行
-
ORDER BY?- 對結果排序
-
LIMIT/OFFSET?- 限制返回的行數
2. 書寫順序對比
通常我們這樣書寫 SQL 查詢:
SELECT DISTINCT column1, column2
FROM table1
JOIN table2 ON table1.id = table2.id
WHERE condition
GROUP BY column1
HAVING group_condition
ORDER BY column1
LIMIT 10;
3. 詳細說明
-
FROM/JOIN:首先確定數據來源,包括所有表和它們的連接方式
-
WHERE:應用行級過濾條件,減少后續處理的數據量
-
GROUP BY:將數據按指定列分組
-
HAVING:過濾分組后的結果(與 WHERE 不同,WHERE 過濾行,HAVING 過濾組)
-
SELECT:此時才確定最終返回的列
-
DISTINCT:去除 SELECT 結果中的重復行
-
ORDER BY:對最終結果排序
-
LIMIT/OFFSET:限制返回結果的數量
4. 注意事項
-
這個順序解釋了為什么不能在 WHERE 子句中使用 SELECT 中定義的別名
-
聚合函數只能在 SELECT、HAVING 和 ORDER BY 子句中使用,不能在 WHERE 中使用
-
了解這個順序有助于編寫高效查詢和解決復雜查詢問題