SQLの外部結合(OUTER JOIN)とは?LEFT・RIGHT・FULL JOINの違いと使い方を徹底解説
データベースを扱っていると、2つ以上のテーブルを同時に参照して、結果を1つにまとめて取得したい場面があります。たとえば、「全従業員の名前」と「その従業員が所属する部署名」を取得したい場合、この2つの情報が別々のテーブルに保存されていることがあります。
そんなときに活躍するのがSQLの結合(JOIN)です。テーブルを結合すれば、複数のテーブルにまたがるクエリを実行し、組み合わせた結果セットを作成できます。
本ガイドでは、結合の種類のひとつであるOUTER JOIN(外部結合)に焦点を当てます。OUTER JOINは、結合先のテーブルに関連する行が存在しない場合でも、その行を結果として返す演算子です。3種類のOUTER JOINの特徴と動作、そしてSQLクエリでの実際の使い方を詳しく見ていきましょう。
SQL結合の基礎をおさらい
通常SELECT文で始まるクエリは、データベースから情報を取得するために使われます。一般的に、クエリを書くときは1つのテーブルから情報を取得することを考え、FROM句でどのテーブルを対象にするかを指定します。標準的なSQLクエリの構文は次のとおりです。
SELECT column_name FROM table_name WHERE certain_conditions_are_met;
以下は、employeesテーブルから全従業員の名前の一覧を取得するクエリの例です。
SELECT name FROM employees;
このクエリは次の結果を返します。
| 名前 |
| ルーク マイク ハンナ ジェフ アレクシス エマ ジョナ アダム |
(8行)
WHERE句を使えば、特定の条件を満たすレコードだけに絞り込むこともできます。たとえば、「営業担当者のみ」や「経営幹部のみ」の名前を検索するクエリなどを書くことが可能です。
では、複数のテーブルから情報を取得し、その結果を1つのテーブルにまとめたい場合はどうすればよいのでしょうか。そこで登場するのが結合(JOIN)です。
結合を使うと、複数のテーブルに対してクエリを実行し、条件に一致した行を組み合わせた結果セットを作成できます。主な結合には3種類あります。INNER JOIN(内部結合)、OUTER JOIN(外部結合)、そしてCROSS JOIN(交差結合)です。
INNER JOINは、クエリ対象の両方のテーブルに一致する行がある場合のみその行を返します。一方、OUTER JOINは、結合先のテーブルに関連する行がなくても行を返します。CROSS JOINは結合条件を持たない結合で、片方のテーブルの各行がもう片方のテーブルの各行とすべて組み合わせられます。
SQLの外部結合(OUTER JOIN)とは
これまで説明したとおり、INNER JOINを実行すると、どちらかのテーブルの行がもう片方のテーブルと一致しない場合、その行は結果セットに含まれません。しかし、こうした値も取得したい場合はどうすればよいのでしょうか。そんなときにOUTER JOINを活用します。
OUTER JOINには、次の3種類があります。
- LEFT OUTER JOIN(左外部結合):左側のテーブルの一致しない行を返す
- RIGHT OUTER JOIN(右外部結合):右側のテーブルの一致しない行を返す
- FULL OUTER JOIN(完全外部結合):すべてのテーブルの一致しない行を返す
OUTER JOINは、目的に応じて両テーブルのレコードを柔軟に照合でき、使用した結合の種類に関連するすべてのレコードを返します。
LEFT JOIN(左外部結合)
LEFT JOINは、左側のテーブルのすべての行と、結合条件を満たす右側のテーブルの行を返します。
ここで、employees(従業員)とcompany_departments(会社の部署)という2つのテーブルがあるとします。部署に未配属の従業員がいても含めて、全従業員の名前と所属部署名を取得したいとしましょう。この情報はLEFT JOINを使って取得できます。
以下は、共通の値であるdepartment_idを使ってemployeesテーブルとcompany_departmentsテーブルを結合し、全従業員の名前と部署名を取得するLEFT JOINクエリの例です。
SELECT employees.name, company_departments.name FROM employees LEFT JOIN company_departments ON employees.department_id = company_departments.department_id;
このクエリは次の結果を返します。
| 名前 | 部署名 |
| ルーク | 営業部 |
| マイク | 営業部 |
| ハンナ | 営業部 |
| ジェフ | 営業部 |
| アレクシス | 営業部 |
| エマ | マーケティング部 |
| ジョナ | 経営幹部 |
| アダム | NULL |
(8行)
ご覧のとおり、LEFT JOINは、employeesテーブルのすべての行を、所属部署がcompany_departmentsテーブルに見つからない場合でも返しています。アダムはどの部署にも配属されていないため、部署名がNULLになっています。
RIGHT JOIN(右外部結合)
RIGHT JOIN文は、LEFT JOIN演算子の正反対の動作をします。RIGHT JOINは、右側のテーブルのすべての行と、結合条件を満たす左側のテーブルの行を返します。
今度は、すべての部署名の一覧と、各部署で働く全従業員の名前を取得したいとします。さらに、従業員が誰も配属されていない部署のデータも取得したいとしましょう。このデータは次のクエリで取得できます。
SELECT employees.name, company_departments.name AS "DeptName" FROM employees RIGHT JOIN company_departments ON employees.department_id = company_departments.department_id;
上記のクエリは次の結果を返します。
| 名前 | 部署名 |
| ルーク | 営業部 |
| マイク | 営業部 |
| ハンナ | 営業部 |
| ジェフ | 営業部 |
| アレクシス | 営業部 |
| エマ | マーケティング部 |
| ジョナ | 経営幹部 |
| NULL | 給与部 |
| NULL | 情報システム部 |
(9行)
ご覧のとおり、このクエリはすべての部署の一覧と、それらの部署で働く全従業員の名前を返しました。また、現在スタッフが一人も配属されていない「給与部」と「情報システム部」も結果に含まれています。
さらに注目すべき点として、このクエリの結果にはアダムが含まれていません。アダムはLEFT JOINのクエリでは、どの部署にも配属されていない従業員として現れていました。これは、RIGHT JOINが条件を満たす右側のテーブル(company_departments)のすべての行を含むのに対し、アダムは右側のテーブルのどのレコードにも関連付けられていないためです。
FULL OUTER JOIN(完全外部結合)
FULL OUTER JOINはあまり使われない種類のSQL結合ですが、両方のテーブルから一致しないレコードを返すために使用できます。多くの場合、FULL OUTER JOINは集計関数と組み合わせて、2つのテーブル間にどれほど重複があるかを把握する目的で使われます。
すべての従業員とすべての部署の一覧を取得したいとしましょう。この情報は次のSQLクエリで取得できます。
SELECT employees.name, company_departments.name AS "DeptName" FROM employees FULL OUTER JOIN company_departments ON employees.department_id = company_departments.department_id;
このクエリは次の結果を返します。
| 名前 | 部署名 |
| ルーク | 営業部 |
| マイク | 営業部 |
| ハンナ | 営業部 |
| ジェフ | 営業部 |
| アレクシス | 営業部 |
| エマ | マーケティング部 |
| ジョナ | 経営幹部 |
| アダム | NULL |
| NULL | 給与部 |
| NULL | 情報システム部 |
(10行)
上記の結果セットには、部署に配属されていない従業員も含めて、全従業員の名前とその配属先の部署が一覧されています。また、従業員が誰も配属されていない部署も含めて、すべての部署名の一覧も含まれています。
まとめ
結合(JOIN)は、2つ以上のテーブルを同時にクエリし、組み合わせた結果セットを作成できるSQLの重要な機能です。たとえば、会社の従業員一覧と、それぞれの直近の給与支払い処理日を取得したい場合などに結合を活用できます。
本チュートリアルでは、結合先のテーブルに関連する行がない場合でも行を返すOUTER JOINに焦点を当てました。また、OUTER JOINの3つの主要な種類——LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN——について解説し、それぞれが実務でどのように機能するかを具体例とともに確認しました。
これであなたも、プロのようにSQLのJOIN操作を実行できるようになりました!
-
SQL ServerのPIVOT句とは?クロス集計で行を列に変換する方法を実例付きで解説
SQL Server(Transact-SQL)では、PIVOT句を使用することで、クロス集計(ピボットテーブル)を作成できます。PIVOT句は、テーブル内の行データを列に変換し、集計結果を見やすい形式で表示するための強力な機能です。 下図は、合計値を計算し、行データを列に変換して表示する例です。 PIVOT句の基本構文 SELECT cot_dautien AS bidanh_cot_dautien, [giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n] FROM ( SELECT bang_nguon.cot1
-
SQL ServerのJOIN(結合)とは?4種類の結合方法を構文・図解・実例で徹底解説
SQL Server(Transact-SQL)では、複数のテーブルにまたがるデータを1つのクエリで取得するためにJOIN(結合)を使用します。SQLコマンド内で2つ以上のテーブルを連結する際に使われる、非常に重要な機能です。 SQL Serverで利用できるJOINには、主に次の4種類があります。 INNER JOIN … 内部結合。最も基本的な結合形式です。 LEFT OUTER JOIN … LEFT JOINとも記述できます。 RIGHT OUTER JOIN … RIGHT JOINとも記述できます。 FULL OUTER JOIN … FULL JOINとも記述できます。 以下