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となる。
外部結合は、何かの一覧を表示する場合に、存在しないかもしれない情報を表示する場合に便利です。
参考文献
