本記事では外部結合の手法の一つであるLEFT OUTER JOIN(左外部結合)について解説しています。
LEFT OUTER JOINとは何か、基本的な使い方、検索条件の指定方法や3つ以上のテーブル結合方法など、具体例を交えて説明しています。
目次
LEFT OUTER JOIN(左外部結合)とは
LEFT OUTER JOINは左外部結合とも呼ばれ、SQLにおけるテーブル同士を結合するための方法の一つです。結合元のテーブルにある全てのレコードと、結合元と結合先の条件が一致した結合先のレコードを取得します。

左側のテーブル全て
+
テーブルAとテーブルBの一致したレコード
文章だけでは分かりづらいと思うので、具体例を見てみましょう。
例えば、下記のように従業員を管理するemployeeテーブルを結合元として、部署情報を管理するdepartmentテーブルを結合するとします。
結合するのはemployeeテーブルのdepartment_idカラムとdepartmentテーブルのidカラムです。

結合結果を見ると、employeeテーブルのレコードは全て取得した上で、departmentテーブルからはidが一致するレコードのみを取得しています。
そしてポイントが、結合先であるdepartmentテーブルに存在しない値がある場合にはNULLが割り当てられるということです。
あくまで左側のテーブルが起点となるのが左外部結合のLEFT OUTER JOINです。
LEFT OUTER JOINの使いどころ
LEFT OUTER JOINは一つの情報を元に、全てのパターンを炙り出したい時に有効です。
例えば、先程の例だと従業員の情報を起点に配属先部署の情報を結合しました。配属部署が決まっていない従業員にはNULLが保存されるため、まだ配属先が決まっていない従業員が誰なのか一発で把握できます。
LEFT OUTER JOINの使い方
LEFT OUTER JOINの基本構文は下記です。
SELECT カラム名
FROM テーブル名1
LEFT OUTER JOIN テーブル名2
ON 結合の条件;下記の流れで考えていきます。
FROMの後に結合元となるテーブルを指定LEFT OUTER JOINの後に結合したいテーブルを指定ONの後に結合元のテーブルと結合したいテーブルの結合条件を指定
また、LEFT OUTER JOINはLEFT JOINと省略して書くこともできます。
それでは、具体例を見ていきましょう!
サンプルデータ
下記のとおり、usersテーブルとuser_profilesテーブルを用意します。
user_profilesテーブルではユーザーの居住地情報を管理しています。
usersテーブル
| id | name |
|---|---|
| 1 | 山田 |
| 2 | 鈴木 |
| 3 | 佐藤 |
| 4 | 佐々木 |
| 5 | 丸山 |
user_profilesテーブル
| id | address | user_id |
|---|---|---|
| 1 | 東京都 | 2 |
| 2 | 神奈川県 | 4 |
| 3 | 大阪府 | 5 |
| 4 | 東京都 | 7 |
| 5 | 大阪府 | 10 |
LEFT OUTER JOINでテーブル結合をする
まずはシンプルな左外部結合を見ていきましょう。
検索クエリ
usersテーブルにuser_profilesテーブルを左外部結合する
SELECT *
FROM users
LEFT OUTER JOIN user_profiles
ON users.id = user_profiles.user_id;LEFT OUTER JOIN user_profilesと結合先のテーブルにuser_profilesを指定し、ON users.id = user_profiles.user_idの部分で結合条件を指定しています。
また、下記のようにAS句を使ってテーブルに別名をつけることで簡略化して書くことも可能です。
SELECT *
FROM users AS u
LEFT OUTER JOIN user_profiles AS p
ON u.id = p.user_id;usersテーブルにu、user_profilesテーブルにpと別名をつけています。
実行結果
| id | name | id | address | user_id |
|---|---|---|---|---|
| 2 | 鈴木 | 1 | 東京都 | 2 |
| 4 | 佐々木 | 2 | 神奈川県 | 4 |
| 1 | 山田 | NULL | NULL | NULL |
| 3 | 佐藤 | NULL | NULL | NULL |
| 5 | 丸山 | 3 | 大阪府 | 5 |
結合された結果がこちらです。
何が起こったのかを図に示すと下記になります。

usersテーブルのレコードは全て取得した上で、user_profilesテーブルからはusersテーブルとの結合条件に一致したレコードのみを取得しています。
user_idが1と3の値は存在しないので、NULLが保存されています。
LEFT OUTER JOINで検索条件を指定する
LEFT OUTER JOINで外部結合をする際に、合わせて検索条件を指定することができます。
LEFT OUTER JOIN テーブル名 ON 結合の条件の後にANDで繋いで、検索条件を指定する形です。
検索クエリ
usersテーブルにuser_profilesテーブルを左外部結合する。ただし、user_profilesから取得するのは居住地が東京都のみのものとする
SELECT *
FROM users
LEFT OUTER JOIN user_profiles
ON users.id = user_profiles.user_id
AND address = '東京都';ON 結合の条件の後にANDで繋いでAND address = '東京都'と追加の条件を指定しています。このように、ANDで繋いで追加で結合の条件を指定することができます。
実行結果
| id | name | id | address | user_id |
|---|---|---|---|---|
| 2 | 鈴木 | 1 | 東京都 | 2 |
| 1 | 山田 | NULL | NULL | NULL |
| 3 | 佐藤 | NULL | NULL | NULL |
| 4 | 佐々木 | NULL | NULL | NULL |
| 5 | 丸山 | NULL | NULL | NULL |
居住地が神奈川県や大阪府のデータは除外されたので、結合の際にはNULLが保存されるようになりました。
WHERE句を使って検索条件を指定する
先ほどは居住地が東京都のみのレコードを結合しましたが、実行結果にNULLを含みたくない場合もあるでしょう。
このような場合は、ON 結合の条件 AND 検索条件とするのではなく、WHERE句を使って検索条件を指定します。
検索クエリ
SELECT *
FROM users
LEFT OUTER JOIN user_profiles
ON users.id = user_profiles.user_id
WHERE address = '東京都';WHERE句を使って居住地が東京都の人のみに条件を絞っています。
実行結果
| id | name | id | address | user_id |
|---|---|---|---|---|
| 2 | 鈴木 | 1 | 東京都 | 2 |
WHERE句を使うことで居住地が東京都のみのレコードを取得できました。NULLが含まれるレコードは除外されていることが分かります。
3つ以上のテーブルをLEFT OUTER JOINする
外部結合では、3つ以上のテーブルを結合することも可能です。
usersテーブル、user_profilesテーブルに加えて、下記にユーザーの注文を管理するordersテーブルを用意します。
| id | product | user_id |
|---|---|---|
| 1 | 商品A | 1 |
| 2 | 商品B | 3 |
| 3 | 商品B | 1 |
| 4 | 商品C | 1 |
| 5 | 商品A | 4 |
基本構文
3つ以上のテーブルの結合では、LEFT OUTER JOINを次々と連結していく形になります。
SELECT カラム名
FROM テーブル名1
LEFT OUTER JOIN テーブル名2
ON テーブル名1とテーブル名2の結合条件
LEFT OUTER JOIN テーブル名3
ON テーブル名2とテーブル名3の結合条件
...;2回目の結合ではテーブル名2とテーブル名3の結合としていますが、テーブル名1とテーブル名3の組み合わせでもOKです。
検索クエリ
usersテーブルとuser_profilesテーブルとordersテーブルを左外部結合して一覧で取得する
SELECT
u.id,
u.name,
p.address,
o.product
FROM users AS u
LEFT OUTER JOIN user_profiles AS p
ON u.id = p.user_id
LEFT OUTER JOIN orders AS o
ON u.id = o.user_id;下記の流れで考えます。
- 1回目の
LEFT OUTER JOINではusersテーブルとuser_profilesテーブルを結合 - 2回目の
LEFT OUTER JOINではusersテーブルとordersテーブルを結合 - テーブル名に別名をつけることで、クエリを簡略化
実行結果
| id | name | address | product |
|---|---|---|---|
| 4 | 佐々木 | 神奈川県 | 商品A |
| 2 | 鈴木 | 東京都 | NULL |
| 1 | 山田 | NULL | 商品A |
| 3 | 佐藤 | NULL | 商品B |
| 1 | 山田 | NULL | 商品B |
| 1 | 山田 | NULL | 商品C |
| 5 | 丸山 | 大阪府 | NULL |
3つのテーブルを左外部結合した上で、一覧を取得できました。
値が存在しないところにはNULLが保存されています。
- AIジョブカレ SQL講座
→ 現役データサイエンティストから学べる初心者向けSQL講座で、ビジネスサイドでもエンジニアでも受講可能。受講料も¥38,500(税込)と一般的なスクールと比べると圧倒的に低価格【無料説明会開催中】 - KENスクール SQL講座(MySQL)
→ 全国にある校舎に通学しながら学べるSQL講座。3ヶ月間で15時間のカリキュラムなので、普段は忙しいビジネスパーソンでも無理なく受講できる!【まずは気軽に資料ダウンロード】
内容のまとめ
LEFT OUTER JOINは左外部結合と呼ばれ、SQLにおけるテーブル同士を結合するための手法の一つLEFT OUTER JOINでは、結合元のテーブルにある全てのレコードと、結合元と結合先の条件が一致した結合先のレコードを取得する- 結合元には値があって、結合先には値がない場合は
NULLが保存される LEFT OUTER JOINは一つの情報をもとに、全てのパターンを炙り出したい時に有効- 基本構文は
LEFT OUTER JOIN 結合するテーブル名 ON 結合の条件 LEFT OUTER JOINは単にLEFT JOINと省略することも可能- 結合時に検索条件を指定したい場合は、
ON 結合の条件 AND 検索条件とする - 検索条件を指定して結合結果に
NULLを含みたくない場合は、WHERE句を使う - 3つ以上のテーブルで左外部結合したい場合は、連続して
LEFT OUTER JOINでテーブルを指定する

