INNER JOINとLEFT JOINの違いとは?初心者でもわかるSQLの結合方法を図解イメージで解説
結論から言うと、INNER JOINは「両方のテーブルに存在するデータだけ」を取得し、LEFT JOINは「左側のテーブルのデータをすべて取得し、一致するデータだけ右側から取得する」結合方法です。
SQLを学び始めると必ず登場するのがJOIN(結合)です。特にINNER JOINとLEFT JOINは実務で最も利用される結合方法ですが、「何が違うのかわからない」「どちらを使えばよいのか迷う」という初心者は少なくありません。
この記事では、IT業務に従事する初心者向けに、INNER JOINとLEFT JOINの違い、実務での使い分け、よくあるトラブルや確認方法までわかりやすく解説します。
JOIN(結合)とは
JOINとは、複数のテーブルを関連付けて1つの結果として表示するSQLの機能です。
例えば、社員情報と部署情報を別々のテーブルで管理している場合、JOINを使うことで社員名と部署名をまとめて表示できます。
| 社員テーブル | 部署テーブル |
|---|---|
| 社員ID・氏名・部署ID | 部署ID・部署名 |
この2つのテーブルを部署IDで結合することで、「田中さんは営業部」「佐藤さんは総務部」といった情報を取得できます。
INNER JOINとは
一致するデータだけ取得する
INNER JOINは、両方のテーブルに共通して存在するデータだけを取得します。
つまり、結合条件に一致しないデータは結果に表示されません。
イメージ
| 社員テーブル | 部署テーブル | 結果 |
|---|---|---|
| 社員A(営業) | 営業部 | 表示される |
| 社員B(総務) | 総務部 | 表示される |
| 社員C(部署なし) | なし | 表示されない |
部署情報が存在しない社員は取得されません。
LEFT JOINとは
左側のテーブルはすべて取得する
LEFT JOINは、左側のテーブルのデータをすべて取得します。
右側のテーブルに一致するデータがない場合でも、左側のデータは表示されます。
イメージ
| 社員テーブル | 部署テーブル | 結果 |
|---|---|---|
| 社員A(営業) | 営業部 | 表示される |
| 社員B(総務) | 総務部 | 表示される |
| 社員C(部署なし) | なし | 社員は表示され、部署名はNULL |
部署情報が登録されていない社員も一覧に表示される点が、INNER JOINとの大きな違いです。
INNER JOINとLEFT JOINの違い
| 項目 | INNER JOIN | LEFT JOIN |
|---|---|---|
| 取得するデータ | 一致するデータのみ | 左側はすべて取得 |
| 一致しないデータ | 表示されない | 左側だけ表示される |
| 右側の値 | 必ず存在する | 存在しない場合はNULL |
| 実務での用途 | 関連データだけ必要な場合 | 一覧表示や未登録データの確認 |
実際のIT現場でよくある利用例
INNER JOINを使う場面
- 社員と部署を表示する。
- 受注と顧客情報を表示する。
- 注文と商品情報を一覧表示する。
- 存在する関連データだけ集計する。
関連データが存在しないレコードは不要な場合に利用されます。
LEFT JOINを使う場面
- 部署未登録社員を探す。
- 注文されていない商品を探す。
- ログイン履歴がないユーザーを探す。
- 未設定データを一覧表示する。
LEFT JOINは「不足しているデータ」を確認するためによく使われます。
SQLの実行結果の違い
社員テーブル
| 社員ID | 氏名 | 部署ID |
|---|---|---|
| 1 | 田中 | 10 |
| 2 | 佐藤 | 20 |
| 3 | 鈴木 | NULL |
部署テーブル
| 部署ID | 部署名 |
|---|---|
| 10 | 営業部 |
| 20 | 総務部 |
INNER JOINの結果
| 氏名 | 部署名 |
|---|---|
| 田中 | 営業部 |
| 佐藤 | 総務部 |
鈴木さんは部署情報が存在しないため表示されません。
LEFT JOINの結果
| 氏名 | 部署名 |
|---|---|
| 田中 | 営業部 |
| 佐藤 | 総務部 |
| 鈴木 | NULL |
LEFT JOINでは社員情報はすべて表示され、部署がない場合はNULLになります。
初心者が混乱しやすいポイント
| よくある勘違い | 実際 |
|---|---|
| LEFT JOINは左側だけ取得する | 右側も一致すれば取得する |
| INNER JOINの方がデータが多い | 通常はLEFT JOINの方が件数は多い |
| LEFT JOINならNULLにならない | 一致しなければNULLになる |
| どちらを使っても結果は同じ | 一致しないデータがある場合は結果が変わる |
実務でよくあるトラブル
一覧の件数が少ない
INNER JOINを使用したため、関連データが存在しないレコードが除外されている可能性があります。
NULLが大量に表示される
LEFT JOINで右側のテーブルに一致するデータが存在しない場合です。結合条件やマスタデータを確認しましょう。
件数が想定より増える
結合キーが一意ではなく、1件に対して複数件が結合されている可能性があります。
原因の切り分け方法
- JOIN条件が正しいか確認する。
- 結合キーに誤りがないか確認する。
- 左側・右側テーブルの件数を確認する。
- NULLが含まれていないか確認する。
- 重複データが存在しないか確認する。
GUIでの確認方法
- SQL Server Management Studio(SSMS)
- MySQL Workbench
- Oracle SQL Developer
- pgAdmin
- DBeaver
まず各テーブルを単体で確認し、その後JOINを実行すると、どのデータが結合されているかを把握しやすくなります。
CUIでの確認方法
SQLクライアントから各テーブルの件数やJOIN結果を確認します。
JOIN前後の件数を比較すると、INNER JOINで除外されたデータやLEFT JOINでNULLとなったデータを見つけやすくなります。
ログの確認方法
JOIN自体は通常エラーになりませんが、アプリケーションログやSQLログを確認することで、実際に実行されたSQLや取得件数を確認できます。
画面表示がおかしい場合は、SQLログを確認すると原因の切り分けがしやすくなります。
初心者がやりがちなミス
- INNER JOINとLEFT JOINを使い分けていない。
- 結合条件を間違えている。
- テーブルの主キー・外部キーを理解していない。
- NULLになることを考慮していない。
- JOIN後の件数を確認していない。
現場で評価される確認手順
- まず各テーブルを個別に確認する。
- 主キーと外部キーを確認する。
- JOIN前後の件数を比較する。
- NULLになっている項目を確認する。
- 期待する件数になっているか確認する。
業務で上司へ報告するポイント
- 使用したJOINの種類(INNER JOINまたはLEFT JOIN)。
- 結合キー。
- 取得件数。
- 期待値との差異。
- NULLになっている項目。
- 影響範囲。
エスカレーションするタイミング
- JOIN条件が仕様書と異なる。
- マスタデータが不足している。
- 取得件数が大幅に異なる。
- 本番データに影響する修正が必要。
- 結合キーの設計変更が必要。
影響範囲を確認するポイント
| 確認対象 | 確認内容 |
|---|---|
| 画面表示 | 一覧件数や表示内容に影響がないか |
| 帳票 | 出力データが不足していないか |
| バッチ処理 | 集計結果が変わっていないか |
| API連携 | 取得データに不足がないか |
筆者が現場で経験した事例
運用保守業務で「社員一覧の件数が減った」という問い合わせを受けたことがありました。調査すると、開発時にLEFT JOINだったSQLがINNER JOINへ変更されていました。
部署マスタへ未登録の社員が一覧から除外されていたことが原因でした。LEFT JOINへ戻したところ件数は元に戻り、画面表示も正常になりました。
この経験から、JOINの種類を変更すると取得件数が大きく変わるため、レビュー時には結合方法まで確認することの重要性を学びました。
応用知識
LEFT JOINは「未登録データの抽出」によく使われます。
例えば、LEFT JOINした結果で右側テーブルのキーがNULLのデータだけを抽出すると、「部署未登録社員」「注文されていない商品」「ログイン履歴のないユーザー」などを簡単に見つけることができます。
この考え方は障害調査やデータ品質の確認でも頻繁に利用されます。
関連するIT用語
- SQL(Structured Query Language)
- JOIN(結合)
- OUTER JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- 主キー(Primary Key)
- 外部キー(Foreign Key)
- NULL
- データベース(Database)
よくある質問(FAQ)
INNER JOINとLEFT JOINはどちらを使えばよいですか?
関連データが存在するものだけ取得したい場合はINNER JOIN、左側テーブルを基準にすべて取得したい場合はLEFT JOINを使用します。
LEFT JOINの方が処理は遅いですか?
必ずしも遅いわけではありません。データ量やインデックス、実行計画によって性能は変わります。
LEFT JOINでNULLになるのはエラーですか?
エラーではありません。右側のテーブルに一致するデータが存在しないことを表しています。
実務ではどちらを使うことが多いですか?
どちらも頻繁に使用します。帳票や一覧画面ではLEFT JOIN、関連データだけを取得する検索や集計ではINNER JOINが使われることが多いです。
まとめ
INNER JOINとLEFT JOINは、SQLを扱ううえで必ず理解しておきたい基本的な結合方法です。
- INNER JOINは両方のテーブルに一致するデータだけ取得する。
- LEFT JOINは左側テーブルのデータをすべて取得する。
- 一致しないデータはLEFT JOINではNULLになる。
- 一覧表示や未登録データの確認ではLEFT JOINがよく使われる。
- 検索や集計ではINNER JOINが利用されることが多い。
実務では「取得件数が想定と違う」「一覧からデータが消えた」といったトラブルの原因がJOINの種類にあることも珍しくありません。まずは「INNER JOINは一致するものだけ」「LEFT JOINは左側をすべて残す」という基本を押さえ、JOIN前後の件数を確認する習慣を身に付けることで、障害対応やSQL作成の精度を高めることができます。

コメント