ひろこま Hack Log

プログラミングや機械学習などの知識を記録・共有します

【図解】INNER JOIN と OUTER JOIN

f:id:twx:20190815142233p:plain
【図解】INNER JOIN と OUTER JOIN

INNER JOIN = 両テーブルに存在する行をまとめる

上図を見ても分かるように、 INNER JOIN は両方のテーブルに存在する行をまとめます。

簡単な例を見てみます。

学生 student と学校 school のデータがそれぞれ以下のようにあったとします。

studentテーブル

id name school_id
1 Taro 1
2 Jiro 1
3 Saburo 2
4 Shiro 2
5 Goro 100

schoolテーブル

id name
1 Tokyo school
2 Kyoto school
3 Osaka school

これをベン図で表すと以下のようになります。

f:id:twx:20190815143856p:plain
学生と学校の関係

それではINNER JOINを実行してみます。

文法は

左テーブル名 INNER JOIN 右テーブル名 ON 条件

です。

SELECT * FROM
student INNER JOIN school ON student.school_id = school.id;
id name school_id id name
1 Taro 1 1 Tokyo school
2 Jiro 1 1 Tokyo school
3 Saburo 2 2 Kyoto school
4 Shiro 2 2 Kyoto school

結果は4行表示されました。ここで注目すべきは、 Goro はいかなる school にも属していないため、SQLの実行結果に現れていないという点です。

図示すると以下のようになります。

f:id:twx:20190815150106p:plain
INNER JOINの結果

INNER JOIN では両方のテーブルに存在する行のみを結合するということが確認できました。

なお、余談ですが、INNER JOINは次に説明する OUTER JOIN とは違い、左テーブルと右テーブルの区別がありません。したがって、以下の2つのSQLは同値です。

SELECT * FROM
student INNER JOIN school ON student.school_id = school.id;
SELECT * FROM
school INNER JOIN student ON student.school_id = school.id;

LEFT OUTER JOIN = 左テーブルに存在する行をまとめる

一方、OUTER JOIN は、左(もしくは右)に存在する行をまとめるSQLです。

正確に言うと、OUTER JOIN というものはなく、LEFT OUTER JOIN もしくは RIGHT OUTER JOIN となります。

文法は

左テーブル名 LEFT OUTER JOIN 右テーブル名 ON 条件

です。

SELECT * FROM
student LEFT OUTER JOIN school ON student.school_id = school.id;

結果は以下です。

id name school_id id name
1 Taro 1 1 Tokyo school
2 Jiro 1 1 Tokyo school
3 Saburo 2 2 Kyoto school
4 Shiro 2 2 Kyoto school
5 Goro 100 null null

今回は、 Goro も表示されました。 図示すると以下のようになります。

f:id:twx:20190815150154p:plain
LEFT OUTER JOIN の結果

LEFT OUTER JOIN では左側テーブルにさえ存在すれば結合されるということが確認できました。

なお、LEFT OUTER JOIN は単に LEFT JOIN と書いても同じです。

まとめ

INNER JOIN は両テーブルに存在する行を結合

INNER JOIN は左と右の区別がない

LEFT OUTER JOIN は左テーブルに存在する行を結合

LEFT OUTER JOIN は左と右の区別がある

LEFT OUTER JOIN はLEFT JOINと同じ

以上、INNER JOIN と OUTER JOINの違いを図解でまとめました。良い記事だと思っていただいた方は、以下の「★+」ボタンのクリック、SNSでのシェア、「読者になる」ボタンのクリック、Twitterのフォローをお願いします!

Koma Hirokazu 's Hacklog ―― Copyright © 2018 Koma Hirokazu