內部合併與外部合併的差異:保留的列、NULL、左外部合併與右外部合併、SQL寫法比較
合併(JOIN)是依ON指定的條件(多半是外鍵與主鍵的值相等),組合兩個資料表的列,產生一個結果資料表的操作。內部合併只把有符合條件之對應列的組合留在結果中,沒有對應列的列,不論來自哪個資料表都會消失。外部合併除了符合的組合之外,即使沒有對應列,也會保留指定一側資料表的列,並以NULL填入另一資料表的欄。保留左側資料表所有列的是左外部合併(LEFT OUTER JOIN),保留右側的是右外部合併(RIGHT OUTER JOIN),兩側都保留的是完全外部合併(FULL OUTER JOIN)。依「是否也要在結果中列出沒有對應列的列」來選擇使用。
| 項目 | 內部合併(INNER JOIN) | 外部合併(OUTER JOIN) |
|---|---|---|
| 結果中保留的列 | 只有符合合併條件的列的組合 | 除了符合的組合,還有指定保留一側資料表中沒有對應列的列 |
| 沒有對應列的處理 | 左右兩個資料表的列都會從結果中消失 | 保留一側的列,會把另一資料表的欄設為NULL,作為1列保留。非保留一側的資料表的列會消失 |
| 種類 | 1種。可省略INNER,只寫JOIN | 左外部合併(LEFT)、右外部合併(RIGHT)、完全外部合併(FULL)3種。可省略OUTER |
| SQL寫法的例子 | SELECT … FROM 員工 INNER JOIN 部門 ON 員工.部門ID = 部門.部門ID | SELECT … FROM 員工 LEFT OUTER JOIN 部門 ON 員工.部門ID = 部門.部門ID |
| 結果列數的例子(4名員工中1人的部門ID為NULL,3個部門中1個沒有員工) | 3列。部門ID為NULL的員工與沒有員工的部門都不會出現 | 保留員工資料表的左外部合併為4列(部門ID為NULL的員工,部門名稱為NULL)。兩側都保留的完全外部合併為5列 |
| 資料表的書寫順序 | 左右對調,結果的列也相同(欄的排列會改變) | 左外部合併與右外部合併,哪個資料表寫在左側會改變結果。A LEFT OUTER JOIN B與B RIGHT OUTER JOIN A會傳回相同的列 |
| 對另一資料表之欄的條件 | 寫在ON或寫在WHERE子句,結果都相同 | 寫在WHERE子句時,以NULL填入的列不符合條件而消失,結果可能與內部合併相同。想保留沒有對應列的列時,要寫在ON |
| 主要用途 | 只想使用兩個資料表都有資料者時(例如為訂單加上顧客姓名) | 想列出也包含沒有對應列的列時(例如包含尚未設定部門之員工的員工清單),或想找出沒有對應列的列時 |
數值為具代表性的大致參考值,會因世代或產品而異。