【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の基本構文は下記です。
SQLSELECT カラム名 FROM テーブル名1 LEFT OUTER JOIN テーブル名2 ON 結合の条件;下記の流れで考えていきます。
- FROMの後に結合元となるテーブルを指定
- LEFT OUTER JOINの後に結合したいテーブルを指定
- ONの後に結合元のテーブルと結合したいテーブルの結合条件を指定
また、LEFT OUTER JOINはLEFT JOINと省略して書くこともできます。
それでは、具体例を見ていきましょう!
サンプルデータ
下記のとおり、usersテーブルとuser_profilesテーブルを用意します。
user_profilesテーブルではユーザーの居住地情報を管理しています。
usersテーブル idname1山田2鈴木3佐藤4佐々木5丸山usersテーブル user_profilesテーブル idaddressuser_id1東京都22神奈川県43大阪府54東京都75大阪府10user_profilesテーブルLEFT OUTER JOINでテーブル結合をする
まずはシンプルな左外部結合を見ていきましょう。
検索クエリusersテーブルにuser_profilesテーブルを左外部結合する
SQLSELECT * 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句を使ってテーブルに別名をつけることで簡略化して書くことも可能です。
SQLSELECT * FROM users AS u LEFT OUTER JOIN user_profiles AS p ON u.id = p.user_id;usersテーブルにu、user_profilesテーブルにpと別名をつけています。
実行結果 idnameidaddressuser_id2鈴木1東京都24佐々木2神奈川県41山田NULLNULLNULL3佐藤NULLNULLNULL5丸山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から取得するのは居住地が東京都のみのものとする
SQLSELECT * FROM users LEFT OUTER JOIN user_profiles ON users.id = user_profiles.user_id AND address = '東京都';ON 結合の条件の後にANDで繋いでAND address = '東京都'と追加の条件を指定しています。このように、ANDで繋いで追加で結合の条件を指定することができます。
実行結果 idnameidaddressuser_id2鈴木1東京都21山田NULLNULLNULL3佐藤NULLNULLNULL4佐々木NULLNULLNULL5丸山NULLNULLNULL居住地が神奈川県や大阪府のデータは除外されたので、結合の際にはNULLが保存されるようになりました。
WHERE句を使って検索条件を指定する
先ほどは居住地が東京都のみのレコードを結合しましたが、実行結果にNULLを含みたくない場合もあるでしょう。
このような場合は、ON 結合の条件 AND 検索条件とするのではなく、WHERE句を使って検索条件を指定します。
検索クエリ SQLSELECT * FROM users LEFT OUTER JOIN user_profiles ON users.id = user_profiles.user_id WHERE address = '東京都';WHERE句を使って居住地が東京都の人のみに条件を絞っています。
実行結果 idnameidaddressuser_id2鈴木1東京都2WHERE句を使うことで居住地が東京都のみのレコードを取得できました。NULLが含まれるレコードは除外されていることが分かります。
3つ以上のテーブルをLEFT OUTER JOINする
外部結合では、3つ以上のテーブルを結合することも可能です。
usersテーブル、user_profilesテーブルに加えて、下記にユーザーの注文を管理するordersテーブルを用意します。
idproductuser_id1商品A12商品B33商品B14商品C15商品A4 基本構文3つ以上のテーブルの結合では、LEFT OUTER JOINを次々と連結していく形になります。
SQLSELECT カラム名 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テーブルを左外部結合して一覧で取得する
SQLSELECT 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テーブルを結合
- テーブル名に別名をつけることで、クエリを簡略化
3つのテーブルを左外部結合した上で、一覧を取得できました。
値が存在しないところにはNULLが保存されています。
もっと学びたい方におすすめのSQL講座・スクール- 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でテーブルを指定する