SQL

【SQL】OUTER JOINの使い方(テーブル外部結合)

2021年1月23日

OUTER JOINの基本構文

SQLの「OUTER JOIN」を使えば、テーブルを外部結合できます。

左外部結合の基本構文

SELECT 列名

FROM テーブル名1  LEFT OUTER JOIN  テーブル名2  ON  結合条件;

右外部結合の基本構文

SELECT 列名

FROM テーブル名1  RIGHT OUTER JOIN テーブル名2  ON  結合条件;

※OUTERは省略可

本記事では、テーブルの外部結合を行う方法を解説していきます。

また「userテーブル」と「departmentテーブル」には、次のようなデータが格納されていることを前提としています。

【userテーブル】

ID(id)※PK名前(name)部署ID(department_id)
1001鈴木一郎1
1002佐藤次郎1
1003田中三郎2
1004伊藤四郎2
1005斎藤五郎4

【departmentテーブル】

部署ID (department_id) ※PK部署名 (name)
1営業部
2開発部
3総務部

スポンサーリンク

テーブルの外部結合

テーブルの結合には「内部結合」と「外部結合」があります。

「内部結合」とは両方のテーブルに存在するデータを抽出する結合のことで、「外部結合」とは、基準となるテーブルに存在すれば抽出する結合のことです。

左外部結合(LEFT OUTER JOIN)

左側のテーブルを基準とするのが「左外部結合」(LEFT OUTER JOIN)です。

[左外部結合のイメージ例]

LEFT JOIN

次の例では、LEFT OUTER JOINを使い「userテーブル」と「departmentテーブル」を「user.department_id = department.id」の条件で左外部結合しています。

■LEFT OUTER JOINを使った左外部結合の例

SELECT 
    user.id, user.name, department.name 
FROM 
    user LEFT OUTER JOIN department ON user.department_id = department.id;

■実行結果

+------+----------+--------+
| id   | name     | name   |
+------+----------+--------+
| 1001 | 鈴木一郎 | 営業部 |
| 1002 | 佐藤次郎 | 営業部 |
| 1003 | 田中三郎 | 開発部 |
| 1004 | 伊藤四郎 | 開発部 |
| 1005 | 斎藤五郎 | NULL   |
+------+----------+--------+
5 rows in set (0.00 sec)

左外部結合した結果、基準となる「user」テーブルに存在するデータを抽出し、「department」テーブルからは条件に一致したデータのみ抽出しています。

そのため、部署IDが「user」テーブルにしか存在しない部署ID「4」のレコードは、「user」テーブルの項目(カラム)である社員ID、社員名しか設定されていません。(部署名はNULL)

右外部結合(RIGHT OUTER JOIN)

右側のテーブルを基準とするのが「右外部結合」(RIGHT OUTER JOIN)です。

[右外部結合のイメージ例]

RIGHT JOIN

次の例では、RIGHT OUTER JOINを使い「userテーブル」と「departmentテーブル」を「user.department_id = department.id」の条件で右外部結合しています。

■RIGHT OUTER JOINを使った右外部結合の例

SELECT 
    user.id, user.name, department.name 
FROM 
    user RIGHT OUTER JOIN department ON user.department_id = department.id;

■実行結果

+------+----------+--------+
| id   | name     | name   |
+------+----------+--------+
| 1001 | 鈴木一郎 | 営業部 |
| 1002 | 佐藤次郎 | 営業部 |
| 1003 | 田中三郎 | 開発部 |
| 1004 | 伊藤四郎 | 開発部 |
| NULL | NULL     | 総務部 |
+------+----------+--------+

右外部結合した結果、基準となる「department」テーブルに存在するデータを抽出し、「user」テーブルからは条件に一致したデータのみ抽出しています。

そのため、部署IDが「department」テーブルにしか存在しない部署ID「3」のレコードは、「department」テーブルの項目(カラム)である部署名しか設定されていません。(社員ID、社員名はNULL)

helpful