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 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 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)