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

跨多表資料組合的 SQL 陳述式技巧:SELECT 隱性聯結、JOIN、子查詢完整比較

     編輯:關於SqlServer

1. 隱性聯結 (Implicit JOIN / 逗號語法)

最基本的多表查詢:FROM 列出多表,WHERE 指定聯結條件。

SELECT t1.col1, t2.col2
FROM table1 t1, table2 t2
WHERE t1.col1 = t2.col1;
  • 使用點號 `<表>.<欄>` 明確來源,提升可讀性。
  • 聯結條件欄位不需出現在 SELECT 清單中。
  • 可用 AND 延伸至多表:WHERE t1.c = t2.c AND t1.c = t3.c。
  • 風險:漏寫 WHERE 變成笛卡兒積;某些優化器處理方式不同;OUTER JOIN 支援有限 (舊版 Oracle/SQL Server 需 `(+)` / `*=` 非標準語法)。

2. 明確 JOIN 語法 (ANSI SQL-92)

優勢:結果集控制更精確、多表時效能更穩定、支援完整外部聯結類型。

類型關鍵字語意
INNER JOININNER JOIN ... ON雙方皆有匹配的列
LEFT OUTER JOINLEFT JOIN ... ON左表所有列 + 右表匹配 (無則 NULL)
RIGHT OUTER JOINRIGHT JOIN ... ON右表所有列 + 左表匹配
FULL OUTER JOINFULL JOIN ... ON雙方所有列 (無匹配則 NULL)
CROSS JOINCROSS JOIN笛卡兒積 (無 ON 子句)

範例

SELECT t1.col1, t2.col2
FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 = t2.col1;

3. 子查詢 / 子選擇

在查詢中使用另一查詢結果作為資源,常用於 WHERE、FROM、SELECT 子句。

EXISTS 相關子查詢

SELECT col1 FROM table1 t1
WHERE EXISTS (
    SELECT col1 FROM table2 t2
    WHERE t1.col1 = t2.col1
);
  • 效能考量:子查詢會先完整執行再供外層使用。大表/複雜邏輯下,改寫為 JOIN 通常延遲更低。
  • 適用場景:邏輯更直觀、需引用聚合結果、或應用層難以處理時。

選擇建議

  • 簡單雙表聯結:隱性聯結或 INNER JOIN 皆可。
  • 需外部聯結、三表以上、或追求可維護性:優先使用明確 JOIN。
  • 子查詢用於「存在性檢查」或「衍生表」(FROM 子查詢);大量資料關聯優先改寫為 JOIN。
  • 永遠測試執行計畫與實際效能,資料庫版本、索引、統計資訊皆會影響最佳寫法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved