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 |
これをベン図で表すと以下のようになります。
それでは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の実行結果に現れていないという点です。
図示すると以下のようになります。
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
も表示されました。
図示すると以下のようになります。
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のフォローをお願いします!