【初心者向け】SQLにおけるOUTER JOIN(外部結合)を分かりやすく解説
OUTER JOIN(外部結合)とは何か
OUTER JOINは、2つ以上のテーブルをキーとなるカラム(列)を基に結合し、一致する行だけでなく一致しない行も含めて結果に表示する手法です。
結合するカラムの値が一致しない場合でも、関連性を持ったデータを結合することができます。これにより、欠損データを補完しながら情報を取得することが可能です。
OUTER JOIN(外部結合)の基本的な構文
OUTER JOINを使用する際の基本的な構文は以下の通りです。
SELECT 列名
FROM テーブル1
LEFT/RIGHT/FULL OUTER JOIN テーブル2
ON テーブル1.キーとなる列名 = テーブル2.キーとなる列名;
この例ではSELECTで取得する列を指定し、テーブル1とテーブル2が結合するテーブルを示し、ON以下に結合条件を指定します。結合条件は、キーとなる列同士の一致を判断する基準です。また、LEFT/RIGHT/FULL OUTER JOINのいずれかを選ぶことで、左外部結合、右外部結合、完全外部結合を行うことができます。
左外部結合、右外部結合、完全外部結合については以下に解説します。
これらの外部結合はデータの補完や欠損データの確認、関連データの統合など、さまざまな分析や操作に活用されますので、実際の操作をしたり既存のクエリと実行結果を参照しながら覚えていきましょう。
左外部結合(LEFT OUTER JOIN)
左外部結合は、指定したテーブル(左側のテーブル)の全ての行を含み、共通のキーに基づいて結合条件を満たす行がある場合にはそれを結合します。
一致しない場合は右側のテーブルの該当箇所にはNULLが入ります。左外部結合は左側のテーブルのすべての情報を維持しながら、右側のテーブルのデータを結合する際に使用されます。
左外部結合の構文
SELECT 列名
FROM テーブル1
LEFT OUTER JOIN テーブル2
ON テーブル1.共通のカラム = テーブル2.共通のカラム;
右外部結合(RIGHT OUTER JOIN)
右外部結合は指定したテーブル(右側のテーブル)の全ての行を含み、共通のキーに基づいて結合条件を満たす行がある場合にはそれを結合します。
一致しない場合は左側のテーブルの該当箇所にはNULLが入ります。右外部結合は右側のテーブルのすべての情報を維持しながら、左側のテーブルのデータを結合する際に使用されます。
右外部結合の構文
SELECT 列名
FROM テーブル1
RIGHT OUTER JOIN テーブル2
ON テーブル1.共通のカラム = テーブル2.共通のカラム;
完全外部結合(FULL OUTER JOIN)
完全外部結合は、指定した2つのテーブルの全ての行を含み、共通のキーに基づいて結合条件を満たす行がある場合にはそれを結合します。
一致しない場合はどちらかのテーブルの該当箇所にはNULLが入ります。完全外部結合は両方のテーブルのすべての情報を維持しながら、データの関連性を確認する際に使用されます。
完全外部結合の構文
SELECT 列名
FROM テーブル1
FULL OUTER JOIN テーブル2
ON テーブル1.共通のカラム = テーブル2.共通のカラム;
各結合の違いまとめ
- 左外部結合: 左側のテーブルの全ての行を含み、一致する行がある場合は右側のテーブルの対応する行を結合します。一致しない場合は、右側のテーブルの対応する行にNULLが入ります。
- 右外部結合: 右側のテーブルの全ての行を含み、一致する行がある場合は左側のテーブルの対応する行を結合します。一致しない場合は、左側のテーブルの対応する行にNULLが入ります。
- 完全外部結合: 両方のテーブルの全ての行を含み、一致する行がある場合はそれを結合します。一致しない場合は、どちらかのテーブルの対応する行にNULLが入ります。
OUTER JOINの使い方
ここでは実際のテーブルやデータを交えてOUTER JOINのサンプルコードを示します。より具体的なOUTER JOINの使い方をイメージしてみてください。
この例では顧客情報を格納するCustomersテーブルと注文情報を格納するOrdersテーブルを使用します。
Customers テーブル
| CustomerID | CustomerName | City |
|------------|--------------|-----------|
| 1 | Alice | Tokyo |
| 2 | Bob | Osaka |
| 3 | Carol | Aichi |
Orders テーブル
| OrderID | CustomerID | OrderDate |
|---------|------------|------------|
| 101 | 1 | 2023-07-15 |
| 102 | 2 | 2023-07-16 |
| 103 | 4 | 2023-07-17 |
以下のクエリは、CustomersテーブルとOrdersテーブルをCustomerID列を基準にLEFT OUTER JOINしています。
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
LEFT OUTER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
このクエリの結果は以下の通りです。
| CustomerName | OrderDate |
|--------------|------------|
| Alice | 2023-07-15 |
| Bob | 2023-07-16 |
| Carol | NULL |
この結果は顧客IDを軸にして顧客の名前と注文日が抽出され、一致しない(データが存在しない)顧客の場合にはNULLが表示されていることが分かります。
3つ以上のテーブルでOUTER JOIN(外部結合)を使用する場合
3つ以上のテーブルでOUTER JOINを使用する際にはテーブルを結合する順番に注意する必要があります。
結合するテーブルの順序によって結果が異なることがあるからです。
また、3つ以上のテーブルを結合する場合、途中のテーブルの結果に基づいてさらに別のテーブルを結合することもできます。
例としてCustomersテーブル、Ordersテーブル、そしてProductsテーブルを結合するケースを考えてみましょう。
Customers テーブル
| CustomerID | CustomerName | City |
|------------|--------------|-----------|
| 1 | Alice | Tokyo |
| 2 | Bob | Osaka|
| 3 | Carol | Aichi |
Orders テーブル
| OrderID | CustomerID | OrderDate |
|---------|------------|------------|
| 101 | 1 | 2023-07-15 |
| 102 | 2 | 2023-07-16 |
| 103 | 3 | 2023-07-17 |
Products テーブル
| ProductID | ProductName | Price |
|-----------|-------------|---------|
| 1 | Laptop | 1000 |
| 2 | Smartphone | 800 |
| 3 | Tablet | 500 |
以下のクエリはCustomersテーブル、Ordersテーブル、Productsテーブルの3つのテーブルを結合して、顧客ごとの注文情報と商品情報を取得する例です。
SELECT Customers.CustomerName, Orders.OrderDate, Products.ProductName
FROM Customers
LEFT OUTER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
LEFT OUTER JOIN Products
ON Orders.ProductID = Products.ProductID;
このクエリでは、まずCustomersテーブルとOrdersテーブルをCustomerID列を基準にLEFT OUTER JOINして、その結果をさらにProductsテーブルとProductID列を基準にLEFT OUTER JOINしています。
結果は顧客ごとの注文日とその注文で購入された商品名が表示されます。
ただし、特定の顧客が商品を購入していない場合や、特定の注文が商品情報と関連付けられていない場合には対応する列にはNULLが表示されます。
3つ以上のテーブルでOUTER JOINを使用する際には、結合する順序と結合条件を注意深く設定する必要があります。うまく活用することで複数のテーブルを結合してデータの取得ができます。
OUTER JOINを使うメリット
OUTER JOINを使用することで一致しないデータも含めて関連性のあるデータを取得できます。
データの補完や欠損データの確認に役立ちます。例えば、顧客情報と注文情報を結合して、顧客の注文状況を把握することができます。
OUTER JOINを使う場面
OUTER JOINは、以下のような場面で活用されます。
- 欠損データの確認: データベース内の欠損データを特定する際に使用されます。結合して一致しない行にはNULLが表示されます。
- データの補完: 欠損データを他のテーブルから補完する際にOUTER JOINが有用です。例えば、顧客情報に注文情報を結合して顧客の注文状況を確認することができます。
OUTER JOINを使わないほうが良い場面
OUTER JOINは一致しないデータを含めて結合するため、データベースが大きい場合や結合条件が複雑な場合にクエリのパフォーマンスが低下する可能性があります。
その際にはインデックスの最適化やクエリの工夫が必要です。
外部結合と内部結合の違い
SQLにはINNER JOIN(内部結合)という構文も存在します。内部結合は外部結合とは対照的に、一致するデータのみを結合します。
内部結合と比べてOUTER JOINは一致しないデータも含めて結果を取得できるため、データの補完や欠損データの確認に適しています。
内部結合については、【初心者向け】SQLにおけるINNER JOIN(内部結合)を分かりやすく解説 で詳しく解説しています。
まとめ
OUTER JOINは一致しないデータも含めて結合する手法であり、データの補完や欠損データの確認に役立ちます。
欠損データを補完したり、関連性のある情報を取得する際に活用できるため、データベースの効果的や分析には欠かせない構文です。
ただし、複数のテーブルを結合する場合には結合順に注意する必要があり、大きなテーブルを結合する場合にはパフォーマンスの低下にも注意する必要があります。
記述したクエリが正しいか、データの少ないテーブルで随時確認しながら記述を進めていくのが良いでしょう。