首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

SQL 語句執行順序深度解析:從 FROM 到 LIMIT 的虛擬表演變過程

     編輯:MySQL 綜合教學

核心認知

SQL 與程式語言最大不同:**聲明式** vs **過程式**。SQL 指定「要什麼」,引擎決定「怎麼做」。執行順序與書寫順序**完全不同**。

標準邏輯執行順序(編號即順序)

  1. FROM / JOIN — 確定數據源,產生笛卡爾積(虛擬表 VT1)
  2. ON — 連接條件過濾(VT2)
  3. OUTER JOIN — 添加外部行(VT3)
  4. WHERE — 行級過濾(VT4)
  5. GROUP BY — 分組(VT5)
  6. HAVING — 組級過濾(VT6)
  7. SELECT — 投影列表(VT7)
  8. DISTINCT — 去重(VT8,內存臨時表+唯一索引)
  9. ORDER BY — 排序,返回**游標**(VC9,非表)
  10. LIMIT — 截取(最終結果)

完整演示:逐步虛擬表演變

測試數據

TABLE table1 (customer_id, city)
TABLE table2 (order_id, customer_id)

table1: (163,hangzhou), (9you,shanghai), (baidu,hangzhou), (tx,hangzhou)
table2: (1,163), (2,163), (3,9you), (4,9you), (5,9you), (6,tx), (7,NULL)

查詢語句

SELECT a.customer_id, COUNT(b.order_id) AS total_orders
FROM table1 AS a
LEFT JOIN table2 AS b ON a.customer_id = b.customer_id
WHERE a.city = 'hangzhou'
GROUP BY a.customer_id
HAVING COUNT(b.order_id) < 2
ORDER BY total_orders DESC;

步驟演變

步驟操作虛擬表關鍵變化
1 FROM笛卡爾積VT1:4×7=28 行
2 ONa.cust_id=b.cust_idVT2:6 行(匹配行)
3 LEFT JOIN保留左表VT3:+1 行(baidu,NULL,NULL)
4 WHEREcity=hangzhouVT4:4 行(163×2, tx, baidu)
5 GROUP BY按 customer_idVT5:3 組(163, tx, baidu)
6 HAVINGcount<2VT6:2 組(tx:1, baidu:0)
7 SELECT投影 + 聚合VT7:(tx,1), (baidu,0)
8 DISTINCT無重複VT8:同 VT7
9 ORDER BYtotal_orders DESCVC9:游標 (tx,1) → (baidu,0)
10 LIMIT無最終結果同 VC9

關鍵洞見

  • 每步產生虛擬表,供下一步使用,對調用者不可見
  • SELECT 書寫在第一行,但**倒數第三執行**
  • ORDER BY 是**唯一能使用 SELECT 別名**的階段(如 total_orders)
  • ORDER BY 返回**游標**而非表,**不能用於子查詢/視圖/派生表**
  • WHERE 在 GROUP BY 前,**不能使用聚合函數**
  • HAVING 在 GROUP BY 後,**可使用聚合函數**

常見錯誤根因

錯誤寫法原因正確寫法
SELECT a, COUNT(*) FROM t WHERE COUNT(*)>1WHERE 階段無聚合結果HAVING COUNT(*)>1
SELECT a, b FROM t GROUP BY ab 未分組未聚合GROUP BY a,b 或 MAX(b)
CREATE VIEW v AS SELECT * FROM t ORDER BY id視圖不接受游標去掉 ORDER BY 或加 LIMIT

實戰建議

  • 寫 SQL 時按**邏輯順序思考**:從哪裡來 → 怎麼連 → 怎麼篩 → 怎麼分 → 怎麼算 → 怎麼排 → 取多少
  • 用 EXPLAIN 驗證實際執行計劃(物理順序可能經優化器調整)
  • 避免在視圖/子查詢中使用 ORDER BY(除非配合 LIMIT)

參考資源

《SQL 邏輯查詢處理階段》 — Itzik Ben-Gan 著《Microsoft SQL Server 2012 T-SQL Fundamentals》

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved