0コメント

【AP午後試験】SQLの穴埋めでミスしない!「相関副問合せ」と「外結合」のひっかけを撃退する集中講義

【応用情報技術者】SQL表結合と副問合せを完全攻略!実務で役立つデータベース運用術

🚀【応用情報技術者】SQL表結合と副問合せを完全攻略!重要用語・ひっかけ対策・実務活用まで120点解説

データベース設計や運用において、複数の表から必要な情報を効率的に抽出するスキルは必須です。本記事では、応用情報技術者試験の頻出分野である「表の結合」「COALESCE式」「副問合せ」について、実務的な視点を交えて解説します。

📊 午後試験突破の鍵:重要用語と出題トレンド

🔑 最優先マスター用語

  • 左外結合 (LEFT OUTER JOIN):マスタ参照の基本。
  • 相関副問合せ:主問合せとの連動ロジック。
  • EXISTS / NOT EXISTS:存在判定の定石。
  • COALESCE式:NULL値の高度な制御。
  • 相関名(エイリアス):自己結合時の必須知識。

傾向と対策(AP午後試験)

近年の午後試験では、「図に示された業務要件を満たすための正しい結合条件を選べるか」という読解力が重視されます。特に、単なるINNER JOINではなく、データ欠落を防ぐためのOUTER JOINや、集合の差を求めるNOT EXISTSの穴埋めは、合否を分ける勝負所となります。

💡 試験のコツ: SQLの穴埋め問題では、FROM句で定義された「相関名」を見落とさないことが重要です。元の表名を使って回答すると不正解になるため、常にエイリアスを意識する癖をつけましょう。

1. 表の結合(JOIN)の極意:データの欠落を防ぐ

結合演算で最も重要なのは、「一致しない行をどう扱うか」という視点です。

🔹内結合 (INNER JOIN)

両方の表に共通のキーが存在する行だけを結合します。

💻 具体的な使用状況:
「注文表」と「商品表」を結合し、現在注文が入っている商品のリストを作成する場合。注文されていない商品は結果に表示されません。

🔹外結合 (LEFT/RIGHT/FULL OUTER JOIN)

一致しない行をNULLで補完して残します。応用情報では、マスタ表を基準にする「左外結合」が頻出です。

💻 具体的な使用状況:
「社員マスタ」と「資格取得表」を結合し、資格を持っていない人も含めた全社員の名簿を作成する場合。資格未取得者は資格名の列がNULLになります。

2. COALESCE式による高度なデータ補完

COALESCE(A, B)は、AがNULLならBを返す関数です。これは「データの揺らぎ」を吸収するのに役立ちます。

SELECT 社員名, COALESCE(部門名, '未配属') FROM 社員 LEFT JOIN 部門 ...
💡 応用情報のポイント:
FULL OUTER JOIN(完全外結合)では、左右どちらのキーもNULLになる可能性があるため、COALESCE(A.ID, B.ID)のように記述して、有効なキーを必ず一つ抽出するテクニックがよく使われます。

3. 相関副問合せと EXISTS の真価

副問合せには、単発実行タイプと、主問合せと連動する「相関副問合せ」があります。

🔍EXISTS 演算子の挙動

「条件に合うデータが1件でもあるか?」を判定します。SELECT *と書きますが、実際に全列を読み込むわけではないため、高速です。

💻 具体的な使用状況:
「顧客マスタ」から、過去に一度でも100万円以上の購入履歴がある顧客を抽出する場合。一度でも条件に合致すれば「真」となるため、大量の履歴データがある場合にINより効率的です。

4. 3つ以上の表の結合と相関名

複雑なシステムでは、3つ以上の表を結合することが当たり前です。その際、AS(相関名)を使って表に別名を付けます。

SELECT A.氏名, B.部門名, C.売上 FROM 社員 A JOIN 部門 B ON A.部門ID = B.ID JOIN 売上 C ON A.ID = C.社員ID

※一度 A と決めたら、以降 社員.氏名 とは書けません。このルールは午後試験の穴埋めで非常に重要です。


5. 集合演算(UNION, INTERSECT, EXCEPT)

結合(JOIN)が「横」に繋げるのに対し、集合演算は「縦」に重ねます。

  • UNION (和): 重複を排除して合体。システム統合時の名寄せなどに使用。
  • EXCEPT (差): 「A表にはいるがB表にはいない」データの抽出。退会者リストの作成などに。

📝まとめ:要点チェックリスト

項目重要ポイント
内結合両方に存在するデータのみ。不一致は消滅する。
外結合基準表のデータは全て残す。相手がいなければNULL。
COALESCENULLを避けて「最初に見つかった非NULL値」を採用する。
EXISTS存在判定に特化。相関副問合せでパフォーマンスを発揮。
相関名定義後は元の表名が使えないルールに注意。

次のステップ: 実際にSQL実行環境(SQLiteやPostgreSQL等)で、NULLを含むデータを結合してCOALESCEの挙動を試してみましょう!

⚠️ 合否を分ける!「ひっかけ」一問一答チェック

Q1. 「FROM 社員 AS E」と定義した後、SELECT句で「社員.社員名」と指定してもエラーにはならない?

解答を確認する
❌ 誤り(エラーになる)
一度相関名(エイリアス)を付けたら、それ以降は元の表名を使えません。午後試験の穴埋めで「社員.社員名」と書くと即失点です。必ず「E.社員名」と書きましょう。

Q2. 「NOT EXISTS」を使った相関副問合せで、副問合せ内のSELECT句には何を記述すべき?(例:SELECT * か SELECT 列名か)

解答を確認する
✅ 基本は「SELECT * 」でOK
EXISTSは「行が存在するかどうか」だけを見るため、列名は何でも構いません。慣習的に「*」が使われます。ただし、稀に定数(SELECT 1)が使われることもありますが、意味は同じです。

Q3. 「LEFT OUTER JOIN」で右側の表に該当データがない場合、その行の右側テーブル由来の列には何が入る?

解答を確認する
✅ NULL(空値)
ここがひっかけポイント!「0」や「スペース」が入るわけではありません。「NULL」が入るからこそ、後続の処理でCOALESCE式やIS NULL検索が必要になるのです。

Q4. UNIONを使って2つの表を結合したとき、重複する行はどうなる?

解答を確認する
✅ 重複は排除(1行にまとめ)される
デフォルトの「UNION」は重複を消します。もし重複を残したい場合は「UNION ALL」を使う必要があります。試験で「全件(重複含む)」と指示があればALLを忘れずに!
💡 午後試験の鉄則: 迷ったら「データの集合図(ベン図)」を描いて、どの範囲を抽出したいのか視覚的に整理しましょう。

🏁 おわりに:試験の「先」を見据えたデータベース攻略

ここまで読み進めていただき、ありがとうございます。応用情報技術者試験のデータベース問題は、単なる「SQLの構文テスト」ではありません。その背景には、「複雑なビジネスルールを、いかに矛盾なく、かつ効率的にデータとして取り出せるか」という、システムアーキテクトとしての素養を問う意図が隠されています。

🌟 周辺知識と今後のステップ

  • 正規化とのセット学習: 午後試験では「正規化」で崩した表を「結合」で繋ぎ直す一連の流れがセットで出題されます。
  • パフォーマンス意識: 実務では、結合の順序一つでレスポンスが数秒から数ミリ秒に変わります。インデックスの効果も併せて学習しましょう。
  • NULLの哲学: COALESCEで学んだように、NULLは「値がない」のではなく「不明」や「適用外」を意味します。この解釈がデータ整合性の鍵となります。
「試験問題のSQLが読めるようになったとき、実務の設計書も読めるようになっている。」
データベースは、一度深く理解すれば一生モノのスキルになります。皆さんの合格と、その後のエンジニアとしての飛躍を心より応援しています!

応用情報技術者試験 対策チーム 一同

📚 全用語網羅!データベース結合・演算マスターリスト

1. 結合(JOIN)演算

● 内結合 (INNER JOIN)
結合する両方の表に条件(ON句)と一致する値が存在する行のみを取り出す演算。不一致なデータは結果から除外されるため、「共通部分のみ」を抽出したい時に使用します。
● 左外結合 (LEFT OUTER JOIN)
FROM句の左側に書かれた表を「基準」とし、その全行を表示します。右側の表に一致するデータがない場合は、右側由来の列はすべてNULL(空値)で埋められます。
● 右外結合 (RIGHT OUTER JOIN)
FROM句の右側に書かれた表を「基準」とする演算。左外結合の逆ですが、実務やAP試験では「LEFT OUTER JOIN」に書き換えて記述することが一般的です。
● 完全外結合 (FULL OUTER JOIN)
左右両方の表の全行を結果に含めます。どちらかにしか存在しないデータは、もう片方をNULLで埋めます。「マスタの全差分」を確認する際などに有効です。
● 自然結合 (NATURAL JOIN)
両表で「同じ列名」を持つ列を自動的に結合キーとする演算。ON句を省略できますが、意図しない列で結合されるリスクがあるためAP試験では内容の理解に留めましょう。

2. 関数・構文・記述ルール

● COALESCE(コアレス)式
引数を左から順に評価し、最初に現れた「NULLでない値」を返す関数。外結合で発生したNULLを元のIDやデフォルト値に置き換えるために必須のテクニックです。
● 相関名(エイリアス)
「表名 AS 相関名」として定義する別名。複雑なSQLで記述を短縮するほか、同じ表を複数回結合(自己結合)する際には区別のために必須となります。
● ON句
JOIN演算において、どの列とどの列を紐付けるかという「結合条件」を指定する句。WHERE句による抽出条件と混同しないよう注意が必要です。

3. 副問合せと存在判定

● 副問合せ(サブクエリ)
SQL文の中に含まれる別のSELECT文。FROM句に書いて「一時的な表」として扱ったり、WHERE句に書いて「比較対象のリスト」として扱ったりします。
● 相関副問合せ
主問合せ(外側)の1行ごとに、副問合せ(内側)が実行される特殊な構造。主問合せの値を副問合せの中で参照(相関)させるのが特徴です。
● EXISTS / NOT EXISTS
副問合せの結果が「1行でもあるか(あるいは無いか)」のみを判定する述語。値のリストを返すIN句に比べ、大量データの存在チェックにおいて高効率です。

4. 集合演算

● 和 (UNION)
2つのSELECT文の結果を「縦」に統合し、重複行を排除して1つの結果セットにする演算。
● 共通 (INTERSECT)
2つの表のどちらにも存在する行(積集合)のみを抽出する演算。
● 差 (EXCEPT / MINUS)
1つ目の表の結果から、2つ目の表に含まれる行を差し引く演算。「A表にだけあるデータ」を探す際に便利です。
● 直積 (CROSS JOIN)
2つの表のすべての行を組み合わせる演算。結果の行数は「A表の行数 × B表の行数」となります。
📌 用語学習のアドバイス:
応用情報の午後問題では、これらの用語が「SQL文の穴埋め」や「適切な演算の選択」として登場します。単に言葉の意味を覚えるだけでなく、「どのような結果表(レコード)が得られるか」を常に意識して学習しましょう。

この記事へのコメント