ADHDの転職と資格取得

過去問に学ぶJOINの出題パターンと解法のコツ|INNER・LEFT・RIGHTの使い分け完全ガイド

SQLのJOIN文は、データベースの複数テーブルを結び付ける強力な手段ですが、inner join / left outer join / right outer join の違いを正確に理解していないと、試験本番で思わぬミスを招くことがあります。とくに応用情報技術者試験やデータベーススペシャリスト試験では、出力結果を推測させるタイプの問題が頻出です。本記事では、過去問に登場した出題パターンを題材に、それぞれのJOINの使いどころ・ひっかけポイント・正確な出力イメージを掴むための実践的な学習法を紹介します。

1. 基礎知識とわかりやすい解説

SQLのJOIN句には複数の種類がありますが、試験でよく問われるのは以下の3つです。

INNER JOIN(内部結合)

2つのテーブルにおいて、結合条件を満たすレコードのみを取得します。両テーブルに共通するデータに限定して結果を得たいときに使います。

SELECT *
FROM 商品
INNER JOIN 注文
  ON 商品.商品ID = 注文.商品ID;

✅ 使用シーン
・「実際に注文があった商品だけ」を抽出
・両テーブルにデータがある行だけ必要なとき

LEFT OUTER JOIN(左外部結合)

左側のテーブルの全行を基準に、結合条件を満たす右側テーブルの行を対応付けます。右側に該当がない場合はNULLになります。

SELECT *
FROM 商品
LEFT OUTER JOIN 注文
  ON 商品.商品ID = 注文.商品ID;

✅ 使用シーン
・商品一覧に「まだ売れていない商品」も表示したい
・データ欠損を含めた全体の可視化

RIGHT OUTER JOIN(右外部結合)

LEFT OUTER JOINと左右が逆です。右側のテーブルの全行が結果に残り、左側にマッチしない場合はNULLになります。

SELECT *
FROM 商品
RIGHT OUTER JOIN 注文
  ON 商品.商品ID = 注文.商品ID;

✅ 使用シーン
・「注文されたが、商品マスタに未登録の商品」がないかを調べる

🔍 結果イメージ(Venn図)

venn
A[商品]
B[注文]
AB[共通]
  • INNER JOIN → AB
  • LEFT OUTER JOIN → A + AB
  • RIGHT OUTER JOIN → B + AB

これらの違いを理解することで、「どのレコードが残り、どれがNULLになるか」を正確に予測できるようになります。試験ではこの予測力が問われます。

2. 過去の出題例(2〜3 題)と解説

JOINに関する出題は「出力結果の予測」「結合の正確性」「NULLの扱い」が問われます。ここでは、過去問から代表的な3例をピックアップし、出題意図と解法のポイントを解説します。

【例1】令和3年秋 データベーススペシャリスト 午前Ⅱ 問6

設問要旨
「商品テーブル」と「注文テーブル」をLEFT OUTER JOINした結果、NULLが含まれる行が存在する。その理由を選べ。

ポイント
LEFT JOINは、左側のテーブルのすべての行を出力し、右側に該当するレコードがなければNULLになります。つまり、注文が存在しない商品(未販売)が含まれるとNULLが出る。

正答の選び方
・「商品には存在するが、注文に存在しないデータがある」→○
・「両方に存在する場合でもNULLになる」→×

【例2】令和元年春 応用情報技術者 午後 問4(データベース設計)

設問要旨
3つのテーブル(社員・部署・役職)をJOINして、特定条件に一致する社員一覧を出力。JOINの種類(INNER/LEFT)が混在。

ポイント
複数JOIN時にはJOINの順序と種類によって結果が変わる。INNER JOIN同士では、すべての結合条件を満たすデータしか残らない。

試験者のねらい
・「INNER JOIN → 絞り込まれすぎることがある」
・「LEFT JOINを使えば全社員を出力可能」

【例3】平成29年春 データベーススペシャリスト 午後Ⅰ 問2

設問要旨
LEFT JOINの結果にGROUP BYとCOUNTを組み合わせたSQL。NULLを含むデータのカウントに注意が必要。

落とし穴
NULLはGROUP BYに含まれるが、COUNT(列名) はNULLをカウントしない。
→ つまり「COUNT(*)」と「COUNT(列名)」の違いを理解しているかが問われる。

これらの例から、JOIN問題での重要な着眼点は次の通りです:

  • NULLになる行の意味と発生タイミング
  • JOINの順序・種類による出力結果の違い
  • GROUP BYや集計との併用時の影響

過去問を読むときは、「JOINがどう機能しているか」→「その結果どう出力されるか」を意識することが得点への近道です。

3. つまずきポイント徹底解説

JOIN句は一見シンプルに見えますが、実際の試験や業務では「あれ?なぜこの行が出ない(または出る)んだ?」という混乱が起きやすいです。ここでは代表的なつまずきポイントを3つ紹介します。

① LEFT JOINでNULLが返る理由が直感とズレる

LEFT OUTER JOINを使った際、右側のテーブルに一致する行がなければ、該当列にNULLが入ります。これを見落とすと、「なんでこの行だけ変なんだ?」と混乱する原因に。

SELECT 商品.商品名, 注文.数量
FROM 商品
LEFT JOIN 注文
  ON 商品.商品ID = 注文.商品ID;

→ 注文がない商品は、数量がNULLで出力される

NULLは「存在しない」ことの明示。間違いではない。

② ON句とWHERE句の併用でINNER JOIN化してしまう

LEFT JOINと併用するWHERE句に注意しないと、せっかくの外部結合が無効になることがあります。

-- NG例:LEFT JOINの意味がなくなる
SELECT *
FROM 商品
LEFT JOIN 注文
  ON 商品.商品ID = 注文.商品ID
WHERE 注文.数量 > 10;

→ この場合、注文.数量がNULLの行(未注文の商品)が消えてしまい、実質INNER JOINと同じ振る舞いに。

WHERE条件にNULLを排除するロジックがあると注意!

③ GROUP BYやCOUNTとの併用で集計がずれる

JOIN結果に集計関数を使う場合、COUNTの対象列がNULLかどうかで集計結果が変わります。

-- NULLを含めた件数が知りたいなら COUNT(*) を使う
SELECT 商品.商品名, COUNT(注文.数量)
FROM 商品
LEFT JOIN 注文
  ON 商品.商品ID = 注文.商品ID
GROUP BY 商品.商品名;

COUNT(注文.数量) は NULL をカウントしない。COUNT(*)なら行数カウントとなる。

何を数えたいのか?NULLを含めたいのか?を明確に

4. 今後の出題予想と例題

SQLの出題は年々「構文の暗記」から「業務要件に沿った実装の正しさ」を問う傾向にシフトしています。JOINに関しても、単なる文法理解ではなく“状況に応じた使い分け”が問われると考えられます。

🔮 出題トレンド予測

✅ RIGHT OUTER JOINの登場率UP

過去問ではLEFT JOINの出題が多いですが、RIGHT JOINが「使い慣れていない=ひっかけやすい」として今後の出題が予想されます。

  • 例:「注文に存在するが、商品マスタにない商品IDを抽出」など

✅ 複数テーブルJOINと別名(AS句)の重要性

3テーブル以上のJOINで、テーブル名の曖昧さを排除する記述力が問われることが増えています。

✅ 実務的な用途に沿った“JOINの理由”を問う問題

「なぜINNERではなくLEFTなのか?」「GROUP BY前にJOINする意味は?」といった背景意図に関する設問にも注意。

🧠 実践ミニ例題(作問)

Q:在庫ゼロの商品を抽出するSQL文として最も適切なのはどれか?

テーブル:

  • 商品(商品ID, 商品名)
  • 在庫(商品ID, 在庫数)
A. SELECT 商品.商品名
   FROM 商品
   INNER JOIN 在庫
     ON 商品.商品ID = 在庫.商品ID
   WHERE 在庫.在庫数 = 0;

B. SELECT 商品.商品名
   FROM 商品
   LEFT JOIN 在庫
     ON 商品.商品ID = 在庫.商品ID
   WHERE 在庫.在庫数 = 0;

C. SELECT 商品.商品名
   FROM 商品
   LEFT JOIN 在庫
     ON 商品.商品ID = 在庫.商品ID
   WHERE 在庫.在庫数 IS NULL;

正解:B
→ 在庫が「0」の商品を抽出。Aは在庫テーブルに行がない商品を取りこぼす可能性あり。Cは「在庫情報が登録されていない」商品=未登録を抽出してしまう。

このように、「JOINの選び方+NULLの扱い+WHEREの記述」はセットで考える必要があります。これからの試験では、より実践的な観点での“JOINの判断力”が求められるでしょう。

5. 派生語・関連キーワード

JOINを理解するうえで、INNER / OUTER 以外にも試験や実務で遭遇する関連用語を押さえておくと、混乱を防ぎやすくなります。ここでは代表的な派生語・類似概念を紹介します。

NATURAL JOIN(ナチュラル結合)

2つのテーブルに同じ名前の列がある場合に、その列を自動的に結合キーとして結合するJOIN。

SELECT *
FROM 社員
NATURAL JOIN 部署;

ON句不要だが、暗黙的な結合のため誤解の元になりやすい。

FULL OUTER JOIN(完全外部結合)

INNER / LEFT / RIGHTのいいとこ取り。両方のテーブルのすべての行を対象とし、対応しないデータにはNULLが入る。

SELECT *
FROM 商品
FULL OUTER JOIN 注文
  ON 商品.商品ID = 注文.商品ID;

✅ PostgreSQLなど一部のDBMSでは利用可能だが、MySQLは非対応

CROSS JOIN(直積結合)

すべての組み合わせ(デカルト積)を生成するJOIN。ON句を使わない、もしくは省略することで発生。

SELECT *
FROM 顧客
CROSS JOIN 商品;

✅ 「顧客×商品」の全組み合わせを出すなど、テストデータや全網羅チェックで利用される。

その他の関連概念

用語 概要 注意点
デカルト積 結合条件がない場合の全組み合わせ CROSS JOINとほぼ同義
NULL処理 結合失敗時にNULLになるフィールドの扱い IS NULL / COALESCE を併用することも
結合キー選定 JOINに使う列(主キー・外部キー) 不適切なキー選定で「意図しない重複や欠落」が起きる

6. まとめ

JOINはSQLの中でも頻出でありながら、NULLや条件式の違いによって結果が大きく変わるため、多くの受験者がつまずきやすいテーマです。

本記事では、INNER JOIN / LEFT OUTER JOIN / RIGHT OUTER JOIN の基本から、過去問をもとにした実践的な出題パターンまでを解説しました。

🎯 学習のポイント振り返り

  • INNER / LEFT / RIGHT の違いは、「どのテーブルの行を基準にするか」
  • LEFT JOIN+WHERE句の条件に注意:NULL排除でINNER化することがある
  • COUNT(*) と COUNT(列) の違いは、NULLの有無に大きく影響
  • RIGHT JOINやFULL JOINも、今後の出題可能性あり
  • JOINは「構文の暗記」より、「出力のイメージを描く力」が重要

🧪 練習のすすめ

SQLは「実行して結果を見る」ことで一気に理解が深まります。
以下のようなオンライン環境を活用して、自分でJOINを組んで試すことをおすすめします。

JOINは苦手意識を持つ人が多い分野ですが、出題傾向が安定しているため、理解すれば得点源になります。
ぜひ、この記事をきっかけにJOINを「得意分野」に変えていきましょう!

-ADHDの転職と資格取得