跨多表查詢時,常困惑於該用哪種語法。本文依 SQL-92 標準,系統說明三大主流方式與選擇準則。
方式一:隱性 JOIN(舊式逗號語法)
SELECT t1.col1, t2.col2
FROM table1 t1, table2 t2
WHERE t1.col1 = t2.col1
- 本質為 INNER JOIN
- 多表以逗號分隔,
WHERE 指定關聯條件
- 可用
AND 延伸至多表
- 缺點:易漏寫關聯條件導致笛卡兒積、最佳化器處理方式不一
方式二:顯性 JOIN(ANSI SQL-92 標準)
SELECT t1.col1, t2.col2
FROM table1 t1 INNER JOIN table2 t2
ON t1.col1 = t2.col1
五種 JOIN 型態
| 類型 | 回傳內容 |
| INNER JOIN | 兩表皆有資料的列 |
| LEFT OUTER JOIN | 左表所有列 + 右表匹配列(無則 NULL) |
| RIGHT OUTER JOIN | 右表所有列 + 左表匹配列 |
| FULL OUTER JOIN | 兩表所有列,無匹配處填 NULL |
| CROSS JOIN | 笛卡兒積(無 ON 條件) |
優勢
- 關聯條件與過濾條件分離(ON vs WHERE),可讀性高
- 外部 JOIN 控制精確,避免資料遺失
- 多表查詢最佳化器通常有更好執行計畫
方式三:子查詢
SELECT col1 FROM table1
WHERE EXISTS (
SELECT col1 FROM table2
WHERE table1.col1 = table2.col1
)
- 常用於
EXISTS/IN/NOT IN 邏輯判斷
- 可在
SELECT 清單作為標量子查詢回傳單值
- 效能注意:子查詢會先完整執行再供外層使用,大資料量下較 JOIN 慢
選擇決策樹
- 需精確控制外部 JOIN 行為 → 顯性 JOIN
- 單純內部關聯、表數少、團隊習慣舊語法 → 隱性 JOIN 可接受
- 邏輯為「存在性檢查」或需標量回傳 → 子查詢
- 效能優先、大表關聯 → 改寫為 JOIN 並檢視執行計畫
掌握三種語法特性與適用場景,才能寫出正確、高效、可維護的跨表查詢。
- 上一篇文章: SQL Server GROUP BY 實戰:從基礎語法到多表彙總分析
- 下一篇文章: SQL Server 2005 SP1 新功能深度解析:資料庫鏡像、SAP BI、全文搜尋增強
Copyright ©
程式碼之家 All Rights Reserved