SQL 是宣告式語言,撰寫順序 ≠ 執行順序。引擎依邏輯階段處理,每階段產生虛擬表供下一階段使用,最終結果返回給客戶端。
| 順序 | 階段 | 關鍵字 | 輸入/輸出 |
|---|---|---|---|
| 1 | FROM | FROM <left_table> | 笛卡爾積 → 虛擬表 VT1 |
| 2 | ON | ON <join_condition> | 篩選 VT1 → VT2 |
| 3 | JOIN | <join_type> JOIN <right_table> | 外部連接保留未匹配列 → VT3 |
| 4 | WHERE | WHERE <condition> | 篩選 VT3 → VT4 |
| 5 | GROUP BY | GROUP BY <col_list> | 分組 VT4 → VT5 |
| 6 | CUBE/ROLLUP | WITH CUBE/ROLLUP | 超級群組 → VT6 |
| 7 | HAVING | HAVING <condition> | 篩選群組 VT6 → VT7 |
| 8 | SELECT | SELECT <select_list> | 投影/運算 → VT8 |
| 9 | DISTINCT | DISTINCT | 去重 VT8 → VT9 |
| 10 | ORDER BY | ORDER BY <col_list> | 排序 VT9 → 游標 VC10 |
| 11 | TOP/OFFSET-FETCH | TOP (N) / OFFSET ... FETCH | 取前 N 列 → VT11 (最終結果) |
-- 錯誤:視圖/衍生表含 ORDER BY CREATE VIEW V_Orders AS SELECT * FROM Orders ORDER BY OrderDate; -- Msg 1033: The ORDER BY clause is invalid in views... -- 修正:移除 ORDER BY,或搭配 TOP 100 PERCENT (舊版技巧,新版優化器會忽略) CREATE VIEW V_Orders AS SELECT TOP 100 PERCENT * FROM Orders ORDER BY OrderDate;
熟記 FROM → ON → JOIN → WHERE → GROUP BY → CUBE/ROLLUP → HAVING → SELECT → DISTINCT → ORDER BY → TOP 邏輯順序,是寫出高效、正確 SQL 的基石。每次編寫複雜查詢,心中跑一遍階段流程,即可預判別名可用性、聚合可用性、排序語意、結果集型別。