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を「得意分野」に変えていきましょう!