1. ホーム
  2. コース一覧
  3. データベース基礎コース
  4. 外部結合(OUTER JOIN)してみよう

データベース基礎コース13/13

外部結合(OUTER JOIN)してみよう

こちらではMySQLを通じたデータベースの使い方における、外部結合の方法について学習します。こちらでの学習を通じて、データベースの使い方についてより理解を深めて行きましょう。

外部結合(OUTER JOIN)とは

外部結合(OUTER JOIN)とは、2つ以上のテーブルのデータを取得して1つのテーブルとして 結合(再構成)する方法のうち、「基準となるテーブルに存在するデータ」に紐づくデータを抽出して結合する方法の事を指します。

これに対し、両方のテーブルに存在するデータだけを抽出して再構成する方法を「内部結合(INNER JOIN)」と言います。

左外部結合と右外部結合

外部結合の際に使われる主な方法が「左外部結合」と「右外部結合」です。外部結合を実行するSQL文を記述する際に、文の左側に「基準となるテーブル名」を記述し実行する外部結合が左外部結合、「右側に基準となるテーブル名」を記述し実行する外部結合が右外部結合となります。

左外部結合を行う際にはLEFT OUTER JOINを、右外部結合を行う際にはRIGHT OUTER JOINを用います。OUTERは省略して実行することが可能です(以後の実行例は、全て省略した形で記述しています)。

#左外部結合
SELECT カラム名 FROM 結合元テーブル名 LEFT JOIN 結合先テーブル名 ON 結合元テーブル名.カラム名 = 結合先テーブル名.カラム名;

#右外部結合
SELECT カラム名 FROM 結合先テーブル名 RIGHT JOIN 結合元テーブル名 ON 結合先テーブル名.カラム名 = 結合元テーブル名.カラム名;

どのデータを紐付けて結合するかは、ONに続けて「テーブル名.カラム名」をイコール(=)で繋げて記述することで指定します。

外部結合の実行例

以下に学生の名前を記憶したstudentsテーブルと、学生が所属するクラブ名を記憶したclubテーブルがあります。

先ずはstudentsテーブルのclub_idを結合元に、clubテーブルのidを結合先に指定して、左外部結合を実行してみましょう。

idnameclub_id
1山田太郎1
4佐藤一郎2
3木村花子3
2鈴木佳子
5ジョン スミス6
idclub_name
1野球部
2バスケットボール部
3テニス部
6書道部
7茶道部
SELECT * FROM students LEFT JOIN club ON students.club_id = club.id;

#実行結果
+------+-----------+---------+-------+---------------+
|   id |      name | club_id |     id |     club_name |
+------+-------------+-------+-------+---------------+
|    1 |    山田太郎 |       1 |     1 |          野球部 |
|    4 |    佐藤一郎 |       2 |     2 | バスケットボール部 |
|    3 |    木村花子 |       3 |     3 |        テニス部 |
|    2 |    鈴木佳子 |    null |  null |           null |
|    5 | ジョン スミス |       6 |     6 |          書道部 |
+------+-----------+---------+-------+---------------+

clubテーブルにデータが存在しないフィールドについては、nullが格納されます。

続いて右外部結合を実行してみましょう。同じくstudentsテーブルのclub_idとclubテーブルのidを使用します。

SELECT * FROM students RIGHT JOIN club ON students.club_id = club.id;

#実行結果
+------+-----------+---------+-------+---------------+
|   id |      name | club_id |     id |     club_name |
+------+-------------+-------+-------+---------------+
|    1 |    山田太郎 |       1 |     1 |          野球部 |
|    4 |    佐藤一郎 |       2 |     2 | バスケットボール部 |
|    3 |    木村花子 |       3 |     3 |        テニス部 |
|    5 | ジョン スミス |       6 |     6 |         書道部 |
| null |       null |     null |     7 |          茶道部 |
+------+-----------+---------+-------+---------------+

左外部結合の際と同様に、studentsテーブルにデータが存在しないフィールドについては、nullが格納されます。

その他の結合方法

こちらでは、これまでに取り上げた「左外部結合」と「右外部結合」以外の結合方法について簡単にご紹介します。

両方のテーブルを基準として、一致しないレコードも全て抽出結果に含めて結合する「完全外部結合(FULL (OUTER) JOIN)」という結合方法があります。

書式例と既出のテーブルを使用した実行例は下記の通りです。

#書式例
SELECT カラム名 FROM 結合元テーブル名 FULL JOIN 結合先テーブル名 ON 結合先テーブル名.カラム名 = 結合元テーブル名.カラム名;

#実行例 
SELECT * FROM students FULL JOIN club ON students.club_id = club.id;
#実行結果
+------+-----------+---------+-------+---------------+
|   id |      name | club_id |     id |     club_name |
+------+-------------+-------+-------+---------------+
|    1 |    山田太郎 |       1 |     1 |          野球部 |
|    4 |    佐藤一郎 |       2 |     2 | バスケットボール部 |
|    3 |    木村花子 |       3 |     3 |        テニス部 |
|    2 |    鈴木佳子 |       4 |  null |           null |
|    5 | ジョン スミス |       6 |     6 |          書道部 |
| null |       null |    null |     7 |          茶道部 |
+------+-----------+---------+-------+---------------+

また、左外部結合と右外部結合では外部結合の条件指定をONの後ろに記述していましたが、結合するカラム名が双方のテーブルで全く同じ場合には、ON以降の記述をUSING カラム名に変えてデータを結合することができます。

#左外部結合における書式例
SELECT カラム名 FROM 結合元テーブル名 LEFT JOIN 結合先テーブル名 USING カラム名;

まとめ

今回は外部結合の方法について学びました。

ここで学んだ内容をより深く理解できるよう、ぜひそれぞれの方法について調べてみて下さい。

実際に触れてみたい方は、環境を起動しましょう。

問題を解くためには、十分な画面サイズのPC環境をご利用下さい。