假設有兩張表 Table A(左表) 與 Table B(右表),各 4 筆資料,其中 name 欄位有兩筆相同(Pirate、Ninja):
Table A Table B id name id name 1 Pirate 1 Rutabaga 2 Monkey 2 Pirate 3 Ninja 3 Darth Vader 4 Spaghetti 4 Ninja
只回傳兩表 交集:雙方 name 皆匹配的列。
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name; -- 結果 id name id name 1 Pirate 2 Pirate 3 Ninja 4 Ninja
回傳兩表 並集:所有列,無匹配處以 NULL 填補。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name; -- 結果包含所有 4+4=8 列,無匹配者顯示 NULL
回傳 左表全部 + 右表匹配列;右表無匹配則為 NULL。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name; -- 結果:A 表 4 列全部保留,Monkey、Spaghetti 對應 B 表欄位為 NULL
找出 僅存在於左表 的資料。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS NULL; -- 結果:Monkey、Spaghetti
找出 雙方各自獨有 的資料(排除交集)。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS NULL OR TableB.id IS NULL; -- 結果:Monkey、Spaghetti、Rutabaga、Darth Vader
無 ON 條件,產生 N × M 組合。兩表各 4 列 → 16 列結果。
SELECT * FROM TableA CROSS JOIN TableB;
⚠ 效能警告: 大表交叉連接會產生海量中間結果,極易導致記憶體溢出或查詢超時。生產環境嚴禁無條件使用,若確需笛卡爾積,請先以子查詢或臨時表過濾縮小資料集。
| JOIN 類型 | 結果集含義 | 文氏圖區域 |
|---|---|---|
| INNER JOIN | A ∩ B(交集) | 重疊區 |
| LEFT OUTER JOIN | A 全集 + B 匹配 | 左圓全體 |
| RIGHT OUTER JOIN | B 全集 + A 匹配 | 右圓全體 |
| FULL OUTER JOIN | A ∪ B(並集) | 兩圓全體 |
| CROSS JOIN | A × B(笛卡爾積) | 無法用文氏圖表示 |