🚀【応用情報技術者】SQL表結合と副問合せを完全攻略!重要用語・ひっかけ対策・実務活用まで120点解説
データベース設計や運用において、複数の表から必要な情報を効率的に抽出するスキルは必須です。本記事では、応用情報技術者試験の頻出分野である「表の結合」「COALESCE式」「副問合せ」について、実務的な視点を交えて解説します。
📊 午後試験突破の鍵:重要用語と出題トレンド
🔑 最優先マスター用語
- 左外結合 (LEFT OUTER JOIN):マスタ参照の基本。
- 相関副問合せ:主問合せとの連動ロジック。
- EXISTS / NOT EXISTS:存在判定の定石。
- COALESCE式:NULL値の高度な制御。
- 相関名(エイリアス):自己結合時の必須知識。
傾向と対策(AP午後試験)
近年の午後試験では、「図に示された業務要件を満たすための正しい結合条件を選べるか」という読解力が重視されます。特に、単なるINNER JOINではなく、データ欠落を防ぐためのOUTER JOINや、集合の差を求めるNOT EXISTSの穴埋めは、合否を分ける勝負所となります。
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。 |
| COALESCE | NULLを避けて「最初に見つかった非NULL値」を採用する。 |
| EXISTS | 存在判定に特化。相関副問合せでパフォーマンスを発揮。 |
| 相関名 | 定義後は元の表名が使えないルールに注意。 |
次のステップ: 実際にSQL実行環境(SQLiteやPostgreSQL等)で、NULLを含むデータを結合してCOALESCEの挙動を試してみましょう!
Q1. 「FROM 社員 AS E」と定義した後、SELECT句で「社員.社員名」と指定してもエラーにはならない?
解答を確認する
一度相関名(エイリアス)を付けたら、それ以降は元の表名を使えません。午後試験の穴埋めで「社員.社員名」と書くと即失点です。必ず「E.社員名」と書きましょう。
Q2. 「NOT EXISTS」を使った相関副問合せで、副問合せ内のSELECT句には何を記述すべき?(例:SELECT * か SELECT 列名か)
解答を確認する
EXISTSは「行が存在するかどうか」だけを見るため、列名は何でも構いません。慣習的に「*」が使われます。ただし、稀に定数(SELECT 1)が使われることもありますが、意味は同じです。
Q3. 「LEFT OUTER JOIN」で右側の表に該当データがない場合、その行の右側テーブル由来の列には何が入る?
解答を確認する
ここがひっかけポイント!「0」や「スペース」が入るわけではありません。「NULL」が入るからこそ、後続の処理でCOALESCE式やIS NULL検索が必要になるのです。
Q4. UNIONを使って2つの表を結合したとき、重複する行はどうなる?
解答を確認する
デフォルトの「UNION」は重複を消します。もし重複を残したい場合は「UNION ALL」を使う必要があります。試験で「全件(重複含む)」と指示があればALLを忘れずに!
🏁 おわりに:試験の「先」を見据えたデータベース攻略
ここまで読み進めていただき、ありがとうございます。応用情報技術者試験のデータベース問題は、単なる「SQLの構文テスト」ではありません。その背景には、「複雑なビジネスルールを、いかに矛盾なく、かつ効率的にデータとして取り出せるか」という、システムアーキテクトとしての素養を問う意図が隠されています。
🌟 周辺知識と今後のステップ
- ✅ 正規化とのセット学習: 午後試験では「正規化」で崩した表を「結合」で繋ぎ直す一連の流れがセットで出題されます。
- ✅ パフォーマンス意識: 実務では、結合の順序一つでレスポンスが数秒から数ミリ秒に変わります。インデックスの効果も併せて学習しましょう。
- ✅ NULLの哲学:
COALESCEで学んだように、NULLは「値がない」のではなく「不明」や「適用外」を意味します。この解釈がデータ整合性の鍵となります。
データベースは、一度深く理解すれば一生モノのスキルになります。皆さんの合格と、その後のエンジニアとしての飛躍を心より応援しています!
応用情報技術者試験 対策チーム 一同
📚 全用語網羅!データベース結合・演算マスターリスト
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文の穴埋め」や「適切な演算の選択」として登場します。単に言葉の意味を覚えるだけでなく、「どのような結果表(レコード)が得られるか」を常に意識して学習しましょう。
この記事へのコメント