TL;DR
INNER JOIN
は条件を満たすレコードを結合して抽出すること。条件を満たさないレコードは抽出されない。OUTER JOIN
はテーブルAを指定した外部のテーブルBに結合する。条件に関わらず、結合先のテーブルBのデータは全て抽出される。結合出来なかったレコードのテーブルAのカラムはNULL
となる。
サンプルのデータベース
ここでは、サンプルを作るため3つのテーブルを考えます。
学校のクラブ活動に関するデータベースを作ります。
- clubsテーブルは部活動の一覧を表します。
- studentsテーブルは生徒の一覧を表します。部活動に所属していない生徒もいます。
- club_rosterテーブルは部活動の名簿です。
それぞれのデータは次のようになっています。
clubs
students
club_roster
なお、サンプルコードはこちら。
https://gist.github.com/SRsawaguchi/8e19311dca1672267e9313a16a041495
INNER JOIN(内部結合)
条件を満たすレコードを結合して抽出すること。条件を満たさないレコードは抽出されません。 実例で考えてみましょう。
実例
- 部活動に所属する生徒の情報を出力する。
SQLは次のようになります。
SELECT students.id AS student_id, students.name AS student_name FROM club_roster INNER JOIN students ON club_roster.student_id = students.id ORDER BY student_id;
実行結果
club_roster
とstudents
を結合します。
今回はstudents.id = 8
である生徒、Rodrick
はどんな部活にも所属していません。
そのため、club_roster
には、student_id = 8
となるレコードは存在しません。
結合条件をみたしませんから、Rodrick
は抽出されません。
OUTER JOIN(外部結合)
外部結合は内部結合の逆。
指定したテーブルを他のテーブルに結合すること。
実例
- 生徒の一覧を表示する。ただし、部活動の情報も表示する。
今回は生徒の一覧を表示するものですが、部活動に所属している生徒については部活動も表示します。
SQLは次のようになります。
SELECT students.id AS student_id, students.name AS student_name, clubs.name AS club_name FROM students LEFT OUTER JOIN club_roster ON students.id = club_roster.student_id LEFT OUTER JOIN clubs ON club_roster.club_id = clubs.id ORDER BY student_id;
実行結果
上記の通り、部活動に所属していないstudents.id = 8
である生徒、Rodrick
の情報も表示されています。
しかし、そのclub_name
はNULL
に設定されています。OUTER JOINの場合、該当するレコードがないために結合出来なかった場合、関連するカラムはNULL
となります。
そのため、
- 何かの一覧を表示する場合に、存在しないかもしれない情報を表示する。
という場合に便利です。
さらに詳しい情報を知りたい場合は参考文献をご覧ください。
まとめ
INNER JOIN
は条件を満たすレコードを結合して抽出すること。条件を満たさないレコードは抽出されない。OUTER JOIN
はテーブルAを指定した外部のテーブルBに結合する。条件に関わらず、結合先のテーブルBのデータは全て抽出される。結合出来なかったレコードのテーブルAのカラムはNULL
となる。
外部結合は、何かの一覧を表示する場合に、存在しないかもしれない情報を表示する場合に便利です。