【SQL】LEFT OUTER JOINを使って外部結合をする方法

本記事では外部結合の手法の一つである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の基本構文は下記です。

SQL
SELECT カラム名
FROM テーブル名1
LEFT OUTER JOIN テーブル名2
ON 結合の条件;

下記の流れで考えていきます。

  1. FROMの後に結合元となるテーブルを指定
  2. LEFT OUTER JOINの後に結合したいテーブルを指定
  3. ONの後に結合元のテーブルと結合したいテーブルの結合条件を指定

また、LEFT OUTER JOINLEFT JOINと省略して書くこともできます。

それでは、具体例を見ていきましょう!

サンプルデータ

下記のとおり、usersテーブルとuser_profilesテーブルを用意します。

user_profilesテーブルではユーザーの居住地情報を管理しています。

usersテーブル

idname
1山田
2鈴木
3佐藤
4佐々木
5丸山
usersテーブル

user_profilesテーブル

idaddressuser_id
1東京都2
2神奈川県4
3大阪府5
4東京都7
5大阪府10
user_profilesテーブル

LEFT OUTER JOINでテーブル結合をする

まずはシンプルな左外部結合を見ていきましょう。

検索クエリ

usersテーブルにuser_profilesテーブルを左外部結合する

SQL
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句を使ってテーブルに別名をつけることで簡略化して書くことも可能です。

SQL
SELECT *
FROM users AS u
LEFT OUTER JOIN user_profiles AS p
ON u.id = p.user_id;

usersテーブルにu、user_profilesテーブルにpと別名をつけています。

実行結果

idnameidaddressuser_id
2鈴木1東京都2
4佐々木2神奈川県4
1山田NULLNULLNULL
3佐藤NULLNULLNULL
5丸山3大阪府5

結合された結果がこちらです。

何が起こったのかを図に示すと下記になります。

usersテーブルのレコードは全て取得した上で、user_profilesテーブルからはusersテーブルとの結合条件に一致したレコードのみを取得しています。

user_id13の値は存在しないので、NULLが保存されています。

LEFT OUTER JOINで検索条件を指定する

LEFT OUTER JOINで外部結合をする際に、合わせて検索条件を指定することができます。

LEFT OUTER JOIN テーブル名 ON 結合の条件の後にANDで繋いで、検索条件を指定する形です。

検索クエリ

usersテーブルにuser_profilesテーブルを左外部結合する。ただし、user_profilesから取得するのは居住地が東京都のみのものとする

SQL
SELECT *
FROM users
LEFT OUTER JOIN user_profiles
ON users.id = user_profiles.user_id
AND address = '東京都';

ON 結合の条件の後にANDで繋いでAND address = '東京都'と追加の条件を指定しています。このように、ANDで繋いで追加で結合の条件を指定することができます。

実行結果

idnameidaddressuser_id
2鈴木1東京都2
1山田NULLNULLNULL
3佐藤NULLNULLNULL
4佐々木NULLNULLNULL
5丸山NULLNULLNULL

居住地が神奈川県や大阪府のデータは除外されたので、結合の際にはNULLが保存されるようになりました。

WHERE句を使って検索条件を指定する

先ほどは居住地が東京都のみのレコードを結合しましたが、実行結果にNULLを含みたくない場合もあるでしょう。

このような場合は、ON 結合の条件 AND 検索条件とするのではなく、WHERE句を使って検索条件を指定します

検索クエリ

SQL
SELECT *
FROM users
LEFT OUTER JOIN user_profiles
ON users.id = user_profiles.user_id
WHERE address = '東京都';

WHERE句を使って居住地が東京都の人のみに条件を絞っています。

実行結果

idnameidaddressuser_id
2鈴木1東京都2

WHERE句を使うことで居住地が東京都のみのレコードを取得できました。NULLが含まれるレコードは除外されていることが分かります。

3つ以上のテーブルをLEFT OUTER JOINする

外部結合では、3つ以上のテーブルを結合することも可能です。

usersテーブル、user_profilesテーブルに加えて、下記にユーザーの注文を管理するordersテーブルを用意します。

idproductuser_id
1商品A1
2商品B3
3商品B1
4商品C1
5商品A4

基本構文

3つ以上のテーブルの結合では、LEFT OUTER JOINを次々と連結していく形になります。

SQL
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テーブルを左外部結合して一覧で取得する

SQL
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. 1回目のLEFT OUTER JOINではusersテーブルとuser_profilesテーブルを結合
  2. 2回目のLEFT OUTER JOINではusersテーブルとordersテーブルを結合
  3. テーブル名に別名をつけることで、クエリを簡略化

実行結果

idnameaddressproduct
4佐々木神奈川県商品A
2鈴木東京都NULL
1山田NULL商品A
3佐藤NULL商品B
1山田NULL商品B
1山田NULL商品C
5丸山大阪府NULL

3つのテーブルを左外部結合した上で、一覧を取得できました。

値が存在しないところにはNULLが保存されています。

内容のまとめ

  • 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でテーブルを指定する