SQL FULL JOIN
FULL JOIN は、左テーブルまたは右テーブルのいずれかにマッチがある場合に、すべてのレコードを返します。
- 左側のテーブルの行が右側のテーブルにマッチしない場合、結果セットには左側の行のデータと、右側の全カラムに対する NULL 値が含まれます。
- 右側のテーブルの行が左側のテーブルにマッチしない場合、結果セットには右側の行のデータと、左側の全カラムに対する NULL 値が含まれます。
なお、FULL JOIN と FULL OUTER JOIN キーワードは同一であり、OUTER キーワードは省略可能です。
注意:FULL JOIN は、非常に巨大な結果セット(リザルトセット)を返す可能性があるため、実行時には注意が必要です。
1. FULL JOIN の構文
SELECT カラム名
FROM テーブル1
FULL JOIN テーブル2
ON テーブル1.カラム名 = テーブル2.カラム名
WHERE 条件;2. デモ用データベース
以下は「Customers(顧客)」テーブルからの抜粋です:
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
次は「Orders(注文)」テーブルからの抜粋です:
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10308 | 2 | 7 | 1996-09-18 | 3 |
| 10309 | 37 | 3 | 1996-09-19 | 1 |
| 10310 | 77 | 8 | 1996-09-20 | 2 |
3. SQL FULL JOIN の実装例
以下の SQL ステートメントは、すべての顧客と、すべての注文を抽出します。
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;3.1 実行結果のサンプル
抽出されたデータは以下のようになります:
| CustomerName | OrderID |
|---|---|
| NULL | 10309 |
| NULL | 10310 |
| Alfreds Futterkiste | NULL |
| Ana Trujillo Emparedados y helados | 10308 |
| Antonio Moreno Taquería | NULL |
解説: FULL JOIN は、もう一方のテーブルに一致するデータがあるかどうかにかかわらず、双方のテーブルからすべてのマッチングレコードを返します。そのため、「Orders」にマッチしない「Customers」の行や、「Customers」にマッチしない「Orders」の行もすべてリストアップされます。