たけるのプログラミング

作ったものとか、気ままにアップします。

【SQL】内部結合と外部結合について簡単な説明

※たぶん徐々に追記していきます。


今回のサンプルテーブル

membersテーブル

id name team_id
1 レブロンジェームス 1
2 クリスポール 2
3 デビンブッカー 2
4 カールアンソニータウンズ 3
5 デマーデローザン 4

teamsテーブル

id name
1 レイカーズ
2 サンズ
3 ウルブス

内部結合

結合条件のカラムのフィールドの値が一致するレコードのみ取得する。
今回の例だと、membersテーブルのteam_idの値とteamsのidの値が一致したものを結合し、レコードを取得している。逆に一致していないとレコードを取得しない。デローザンのteam_idカラムのフィールド値の4はteamsテーブルのidカラムのフィールド値に存在しないため結合もできないし、レコードも取得されない。


SELECT * FROM members m JOIN teams t ON t.id = m.team_id

id name team_id id name
1 レブロンジェームス 1 1 レイカーズ
2 クリスポール 2 2 サンズ
3 デビンブッカー 2 2 サンズ
4 カールアンソニータウンズ 3 3 ウルブス






外部結合

基準のテーブルを決めて、そのテーブルの全レコードを取得し、内部結合同様に結合条件を利用して結合する。

LEFT JOIN

leftなのでmembers m LEFT JOIN teams tにおけるmembersテーブルを基準とする。

SELECT * FROM members m LEFT JOIN teams t ON t.id = m.team_id

id name team_id id name
1 レブロンジェームス 1 1 レイカーズ
2 クリスポール 2 2 サンズ
3 デビンブッカー 2 2 サンズ
4 カールアンソニータウンズ 3 3 ウルブス
5 デマーデローザン 4 NULL NULL

基準であるmembersテーブルの全レコードを取得したが、m.team_id = 4 = t.id となるレコードがなかったため t.id と t.nameがnullとなっている。
内部結合の場合はそもそもm.id m.nameも取得されない。

RIGHT JOIN

left joinの考え方と同じ

SELECT * FROM members m RIGHT JOIN teams t ON t.id = m.team_id

id name team_id id name
1 レブロンジェームス 1 1 レイカーズ
2 クリスポール 2 2 サンズ
3 デビンブッカー 2 2 サンズ
4 カールアンソニータウンズ 3 3 ウルブス