SQL表結合的方法
今天來談一下SQL中除了join之外的多表結合方法:
UNION / UNION ALL
- UNION 和 UNION ALL 用於合併兩個或多個查詢的結果,通常用來合併來自不同表格但具有相同欄位的資料。
- UNION 會自動去除重複的資料,而 UNION ALL 會保留所有的資料(包括重複的)。
差別:JOIN 將兩個表的資料基於指定欄位進行橫向結合(並列行),而 UNION 將兩個表的結果垂直合併(串接行)。UNION 要求欄位數量和數據類型相同,而 JOIN 則不需要。
效能:UNION 會去除重複行(去重過程耗時),而 UNION ALL 不去重,效能會比 UNION 好。相比之下,JOIN 更適合用於需要關聯性的情況,而 UNION 適合用於不相關的多組結果的合併。
- 語法範例:
UNION
SELECT column1, column2 FROM table2;
CROSS JOIN
- CROSS JOIN 會產生兩個表的「笛卡爾積」,即將兩個表的每一筆資料互相組合,結果數量是兩表記錄數量的乘積。
- 適用於需要獲取所有可能組合的情況。
差別:CROSS JOIN 是笛卡爾積,沒有條件的匹配,即每一行與另一表的所有行組合。JOIN 通常有條件限制,適用於關聯查詢。
效能:CROSS JOIN 結果集非常龐大,通常比 JOIN 慢,且適合僅需所有可能組合的情況。在實際應用中不常用。
- 語法範例:
CROSS JOIN table2;
NATURAL JOIN
- NATURAL JOIN 會自動基於兩個表中相同名稱的欄位進行連接,因此不需要明確指定欄位。
- 不過它容易出現意外的結果,因為如果兩表有不希望作為連接基礎的相同欄位,結果可能不符合預期。
差別:NATURAL JOIN 自動基於相同名稱的欄位進行連接,而 JOIN 要明確指定匹配條件。
效能:NATURAL JOIN 和普通的 JOIN 沒有明顯效能差別,但 NATURAL JOIN 可能會因為表中意外的相同欄位而產生不正確的結果,增加了潛在的除錯成本。
- 語法範例:
NATURAL JOIN table2;
APPLY(CROSS APPLY 和 OUTER APPLY)
- APPLY 是 SQL Server 特有的語法,用於將左側表的每一行與右側的子查詢結果結合。CROSS APPLY 僅返回匹配的結果,OUTER APPLY 則保留左側表的所有行。
- 對於一些需要多對一的查詢(例如返回每個客戶的最新訂單),APPLY 特別有用。
差別:APPLY 用於每一行執行右側的子查詢,適合對每一行做特定查詢。JOIN 則一次性處理整個表,效率上有差別。
效能:APPLY 通常比 JOIN 慢,因為會對每一行進行查詢,尤其是 OUTER APPLY 保留了左側表的所有行,但在一些情況下可以簡化查詢邏輯。
- 語法範例:
CROSS APPLY (SELECT TOP 1 * FROM table2 t2 WHERE t1.id = t2.id ORDER BY t2.date DESC) AS t2_latest;
子查詢(Subquery)或派生表(Derived Table)
- 可以使用子查詢將一個表的查詢結果作為另一個查詢的一部分,這種方式可以間接地將表進行結合。
- 派生表也可以用於暫時建立查詢結果的表,供外層查詢使用。
差別:子查詢是在查詢內嵌套另一查詢,適合在單表中先過濾或轉換數據。JOIN 對多表查詢更有效。
效能:子查詢通常比 JOIN 慢,因為可能重複計算。當需要多表連接並取結果時,JOIN 更優化。
- 語法範例:
FROM table1 t1,
(SELECT column2 FROM table2 WHERE condition) AS subquery
WHERE t1.id = subquery.id;
CTE(Common Table Expression)
- CTE 是一種可以讓查詢更具可讀性的方式,適合處理多表查詢和遞迴查詢。
- 可以先用 CTE 定義查詢結果,再在後續的查詢中結合其他表。
差別:CTE 是臨時命名的結果集,在查詢中使用 WITH 來定義,可以簡化多層查詢。JOIN 直接連接表。
效能:CTE 與 JOIN 的效能差別較小,但 CTE 能提升複雜查詢的可讀性。對於大表或多次遞迴,CTE 的效能可能略差。
- 語法範例:
SELECT column1, column2 FROM table1
方法 | 描述 | 效能考量 | 適用情境 |
---|---|---|---|
JOIN | 將兩表基於指定欄位進行橫向結合 | 快速,適合大部分情況 | 多表關聯查詢,最常見的多表結合方式 |
UNION / UNION ALL | 合併多表結果,串接行,UNION 去重 | UNION ALL 比 UNION 更高效 | 合併多表結果且字段相同,適合匯總不相關的數據 |
CROSS JOIN | 生成兩表的笛卡爾積,不使用條件 | 效能較差,結果集龐大 | 需要所有可能的組合情況(如產品和分類的組合) |
NATURAL JOIN | 自動基於同名欄位進行結合 | 需注意欄位匹配,效能與 JOIN 相似 | 有相同欄位名稱的簡單表結合,不建議複雜查詢 |
APPLY (CROSS/OUTER) | 每行執行右側子查詢,適合行對行的查詢 | 較慢,對每行執行一次右側子查詢 | 返回每行對應的多結果(如每位員工的最新訂單) |
子查詢 | 將結果嵌入另一查詢中,適合單表操作或過濾 | 效能相對較低,特別是嵌套查詢 | 單表操作或需要先過濾的查詢,不適合大量數據連接 |
CTE (Common Table Expression) | 臨時命名查詢結果集,多層查詢更清晰 | 可讀性高,效能略低於 JOIN | 複雜查詢、多層次查詢,適合多表的邏輯處理 |
留言
張貼留言