データベース基礎コース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
を結合先に指定して、左外部結合を実行してみましょう。
id | name | club_id |
---|---|---|
1 | 山田太郎 | 1 |
4 | 佐藤一郎 | 2 |
3 | 木村花子 | 3 |
2 | 鈴木佳子 | |
5 | ジョン スミス | 6 |
id | club_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環境をご利用下さい。