本記事では外部結合の手法の一つである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
でテーブルを指定する