SQLのJOINの仕組みを図解で説明 〜INNER JOINとLEFT JOINの違い〜
SQLの「INNER JOIN」と「LEFT JOIN」の違いを説明できますか?
どちらも表をつなげる書き方ですが、結果に出てくる行が違います。
違いを知らないまま使うと、「あるはずのデータが結果に出てこない」ということが起きます。
表の結合(JOIN)の仕組みについて、実際の表を使って説明していきます。

JOINとは?
JOINは、複数の表を、共通の列でつなげて1つの表として取り出すこと です。
データベースでは、データの重複をなくすために、情報を複数の表に分けて保存します。
例えば、社員の情報と部署の情報を、次の2つの表に分けておきます。

社員の表には部署番号しかないので、部署名を知るには部署の表と組み合わせる必要があります。
この時に使うのがJOINです。
2つの表を、共通の列である「部署番号」でつなげます。
高橋さんは、まだ部署に所属していないので、部署番号は空(NULL)です。
INNER JOIN(内部結合)
INNER JOINは、両方の表で、つなげる値が一致した行だけを取り出す 結合です。
結合する前の2つの表で、部署番号が一致する行を線でつなぐと、次のようになります。

これをSQLで書くと、次のようになります。
SELECT 社員.名前, 部署.部署名
FROM 社員
INNER JOIN 部署 ON 社員.部署番号 = 部署.部署番号;

結果は、佐藤さん(営業部)と鈴木さん(開発部)の2行になります。
部署番号が入っていない高橋さんは、部署の表に一致する行がないので、結果に出てきません。
社員がいない総務部も、結果に出てきません。
LEFT JOIN(左外部結合)
LEFT JOINは、左側の表の行はすべて残し、右側の表は一致した行だけをつなげる 結合です。
SQLの「FROM」の後に書いた表が左側、「JOIN」の後に書いた表が右側です。
結合する前の2つの表で見ると、次のようになります。

これをSQLで書くと、次のようになります。
SELECT 社員.名前, 部署.部署名
FROM 社員
LEFT JOIN 部署 ON 社員.部署番号 = 部署.部署番号;

結果は、佐藤さん、鈴木さん、高橋さんの3行になります。
高橋さんは部署の表に一致する行がないので、部署名は NULL(値なし) になります。
「部署に所属していない社員も含めて、全員の一覧を出したい」という時は、LEFT JOINを使います。
INNER JOINで書くと、高橋さんが一覧から抜けてしまいます。
結合の種類
結合には、ほかにもいくつかの種類があります。

RIGHT JOINは、LEFT JOINの左右を入れ替えたものです。
表を書く順番を入れ替えればLEFT JOINで同じ結果になるので、実際にはLEFT JOINを使うことが多いです。
FULL OUTER JOINは、使っているデータベースによっては対応していないこともあります。
迷った時の考え方
どの結合を使うか迷った時は、どちらの表の行を必ず残したいか を考えます。
- 一致したものだけでよい: INNER JOIN
- 左の表の行は必ず全部残したい: LEFT JOIN
結合の説明では、2つの円が重なった図(ベン図)がよく使われます。
ですが、実際の結果は行と列の表になるので、今回のように表を並べて確かめると分かりやすいです。
まとめ
今回はSQLのJOINの仕組みについて説明しました。
JOINは、複数の表を共通の列でつなげて取り出す方法です。
INNER JOINは両方で一致した行だけ、LEFT JOINは左の表の行をすべて残し、一致しない部分はNULLになります。
「必ず残したい行がある方を左にして、LEFT JOINを使う」と覚えておきましょう。
表を分けて保存する考え方については、正規化を図解で説明の記事で説明しています。
表をつなぐ主キーと外部キーについては、ER図とキーの仕組みを図解で説明の記事で説明しています。
よく使う結合に名前を付けて保存するビューについては、ビューの仕組みを図解で説明の記事で説明しています。


