SQL 執行順序 vs 撰寫順序
MySQL 查詢處理共 11 階段,每階段產生一張虛擬表作為下一階段輸入,最終結果為最後一張虛擬表。理解真實執行順序是優化複雜查詢的關鍵。
11 階段執行流程
- FROM:確定資料來源,執行 JOIN、衍生表
- ON:JOIN 條件過濾
- JOIN:外部連接補齊未匹配行
- WHERE:行級過濾(無法使用別名)
- GROUP BY:分組聚合
- HAVING:分組後過濾(可用聚合函數、別名)
- SELECT:投影列、計算表達式、別名定義
- DISTINCT:去重
- ORDER BY:排序(可用 SELECT 別名)
- LIMIT:分頁截取

關鍵推論與優化啟示
- WHERE 不能用 SELECT 別名:WHERE 在 SELECT 之前執行
- HAVING 可用別名:HAVING 在 SELECT 之後
- GROUP BY 隱含排序:MySQL 5.7+ 預設不再隱含排序,需顯式
ORDER BY
- LIMIT 最後執行:先完成所有運算再截取,大偏移量效能差,建議用覆蓋索引 + 子查詢優化
- JOIN 驅動表選擇:小表驅動大表,利用索引
實戰案例
-- 錯誤:WHERE 使用別名
SELECT id, name AS n FROM user WHERE n = 'Tom'; -- Unknown column 'n'
-- 正確:用子查詢或重複表達式
SELECT * FROM (SELECT id, name AS n FROM user) t WHERE n = 'Tom';
-- 或
SELECT id, name AS n FROM user WHERE name = 'Tom';
掌握執行順序,能寫出正確且高效的 SQL。