SQLを勉強していて、テーブルを結合する段階に入ると、誰もが一度は混乱しますよね。
特に、ただのjoinとleft joinの使い分けは、テキストの難しい図を見ても今ひとつピンとこないものです。
どっちを使えば自分の欲しいデータが消えずに正しく抜けるのか、不安になりながらクエリを書いていませんか。
この記事では、そんなモヤモヤをすっきり解消するために、身近な「クラス名簿」を例にして、どこよりも直感的に違いを解説します。
SQL初心者がつまずくjoinとleft joinの違いとは
2つの結合で決定的に異なるデータの残り方
SQLでデータを結合するとき、一番大切なのは「結合した後に、元のデータが消えてしまうかどうか」という点です。
実は、ただのjoinとleft joinの最大の違いは、左右のテーブルで一致しないデータがあったときの処理方法にあります。
まずは、それぞれの特徴をシンプルに整理した以下の表を見てみましょう。
| 結合の種類 | 正式名称 | データの抽出ルール | 一致しないデータの扱い |
|---|---|---|---|
| join | INNER JOIN(内部結合) | 両方のテーブルに存在するデータのみを合体させる | どちらか一方にしかないデータは結果から消滅する |
| left join | LEFT OUTER JOIN(左外部結合) | 左側のテーブルにあるデータをすべて残したまま合体させる | 右側にデータがなければ「NULL(空っぽ)」として残る |
このように、joinは互いに共通するデータだけを厳選して残すのに対し、left joinは左側のテーブルを主役にして、右側のデータを付け足すイメージです。
これだけではまだイメージが湧きにくいかもしれないので、次は具体的な例を使って頭の中を整理していきましょう。
クラス名簿でイメージする!joinとleft joinの直感的な違い
基準となる2つの名簿を用意する
ここでは、学校のクラスをイメージしてみてください。
手元に、クラス全員が載っている「クラス名簿」と、部活動に入っている人だけが載っている「部活名簿」の2つがあるとします。
・出席番号1番:佐藤さん
・出席番号2番:鈴木さん
・出席番号3番:高橋さん
・出席番号1番:サッカー部
・出席番号3番:吹奏楽部
(鈴木さんは部活に入っていません)
この2つの名簿を結合するとき、joinとleft joinで結果がどう変わるかを見てみましょう。
joinは両方に載っている人だけを抜き出す
joinを使って2つの名簿を合体させると、「クラス名簿にも、部活名簿にも、両方に名前がある人」だけが残ります。
結合した結果は、以下のようになります。
- 佐藤さん:サッカー部
- 高橋さん:吹奏楽部
部活に入っていない鈴木さんは、部活名簿に存在しないため、結合した結果から完全に消えてしまいます。
このように、条件に一致するデータだけを厳格に抜き出すのがjoinの仕事です。
left joinは左側のクラス名簿全員を基準に抜き出す
一方で、left joinを使って結合すると、左側にある「クラス名簿」の全員が主役になります。
部活に入っているかどうかにかかわらず、クラス名簿に載っている全員をまず書き出します。
その上で、部活名簿に情報がある人には部活名を書き足し、情報がない人には空欄として残すイメージです。
結合した結果は、以下のようになります。
- 佐藤さん:サッカー部
- 鈴木さん:NULL(未所属)
- 高橋さん:吹奏楽部
鈴木さんの名前は消されることなく、しっかりとリストに残っていますね。
このように、主役となるテーブルのデータを1件も漏らさずに残したいときに使うのがleft joinです。
どっちを使うべき?実務での使い分け基準と初心者がやりがちな失敗
実務での使い分けを判断するシンプルな基準
日々の業務でどちらの結合を使うか迷ったときは、以下の問いかけを自分にしてみてください。
「データが存在しない行を、システム画面やレポートから消してしまってもいいか?」
この問いに対する答えによって、使うべきクエリは自然と決まります。
・売上が発生している注文データだけを抽出したいとき
・会員登録が完了しているアクティブなユーザーだけをリストアップしたいとき
・今月まだ買い物を実施していない人も含めて、会員全員の購入金額リストを作りたいとき
・商品マスタにある全商品を表示し、売れていない商品は売上0として出力したいとき
初心者が陥りやすいデータ消失の罠
SQLを書き慣れていない時期に最も多いミスが、本当はleft joinを使うべきところで、無意識にjoinを書いてしまうことです。
例えば、全商品の在庫リストを作ろうとしたとき、joinを使ってしまうと「まだ一度も出荷履歴がない新商品」がリストから丸ごと消えてしまいます。
出荷されていないだけで倉庫には在庫があるはずなのに、システム上の出荷データが存在しないために、商品そのものが画面に表示されなくなってしまうのです。
データを抽出するときは、「消えて困るデータが左側のテーブルに眠っていないか」を常に意識する癖をつけておくと、こうした手痛いミスを防ぐことができます。
迷わずデータを抜き出せるようになったあなたへ
ここまで、名簿の例えを通して2つの結合の違いを見てきました。
joinとleft joinの性質を一度体感してしまえば、データの行方を見失うことはもうありません。
まずは手元の環境で、ごく簡単な数行のテストデータを使い、2つの結合をそれぞれ実行して結果を眺めてみてください。
実際に自分の目で、データが残る様子と消える様子を確認することが、何よりも早く記述を体得できる近道になります。
今回は2つのテーブルを繋ぐ基本をお伝えしましたが、実務が進むと、3つ以上のテーブルを同時に結合したいけれどどう書けばいいのだろう、という疑問が必ず湧いてきます。
そんな複雑な複数テーブルの結合を整理して美しく書くコツについては、こちらの記事で分かりやすく手順を解説していますので、あわせて参考にしてください。

