情報処理安全確保支援士試験 2010年 秋期 午前221


和両立である表 R (ID, NAME), S (NO, NAMAE) がある。差集合 R-S を求める SELECT 文とするために、a に入れるべき適切な字句はどれか。ここで、下線部は主キーを表す。また、NAME と NAMAE は NULL 不可とする。
 SELECT * FROM R WHERE (a)
     (SELECT * FROM S WHERE S.NO = R.ID AND S.NAMAE = R.NAME)
EXISTS
NOT EXISTS(正解)
NOT IN
R.ID NOT IN

解説

差集合 R-S を求める SELECT 文の適切な字句【午前2 解説】

要点まとめ

  • 結論:差集合 R-S を求めるには「NOT EXISTS」を使うのが最適です。
  • 根拠:NOT EXISTS はサブクエリの結果が存在しない行を抽出し、NULL の影響を受けにくいからです。
  • 差がつくポイント:NULL 不可の条件下でも安全に動作し、パフォーマンス面でも優れるため、NOT EXISTS を選ぶことが重要です。

正解の理由

差集合 R-S は「R に存在するが S に存在しない」行を抽出する操作です。
この条件を SQL で表す際、サブクエリで S に該当する行が存在しないことを確認する必要があります。
「NOT EXISTS」はサブクエリの結果が空であることを判定し、NULL 値の影響を受けずに正確に差集合を表現できます。
したがって、選択肢の中で「イ: NOT EXISTS」が最も適切です。

よくある誤解

「NOT IN」を使うと NULL 値がある場合に意図しない結果になることがあります。
また、「EXISTS」は存在する行を抽出するため、差集合には不適切です。

解法ステップ

  1. 差集合 R-S の意味を理解する(R にあって S にない行)。
  2. サブクエリで S の該当行を検索し、存在しないことを条件にする。
  3. NULL の影響を考慮し、「NOT EXISTS」を使う。
  4. SQL 文に「WHERE NOT EXISTS (サブクエリ)」を記述する。
  5. 主キーや NULL 制約を確認し、正確な条件を設定する。

選択肢別の誤答解説

  • ア: EXISTS
    → サブクエリの結果が存在する行を抽出するため、差集合の条件と逆になります。
  • イ: NOT EXISTS
    → サブクエリの結果が存在しない行を抽出し、差集合を正しく表現します。
  • ウ: NOT IN
    → NULL 値がある場合に結果が不正確になる可能性があり、今回の条件では不適切です。
  • エ: R.ID NOT IN
    → 「R.ID NOT IN」とだけ書くのは不完全で、サブクエリの条件が不足しており誤りです。

補足コラム

SQL における差集合は「EXCEPT」句で簡潔に表現できますが、和両立の表や NULL 制約がある場合は「NOT EXISTS」を使う方法が汎用的で安全です。
また、パフォーマンス面ではインデックスの有無やデータ量によって「NOT EXISTS」と「NOT IN」の効果が変わるため、実際の環境に応じて使い分けることも重要です。

FAQ

Q: なぜ「NOT IN」は NULL 値に弱いのですか?
A: 「NOT IN」はサブクエリの結果に NULL が含まれると比較が不定(UNKNOWN)となり、意図した行が除外されることがあります。
Q: 「EXISTS」と「NOT EXISTS」の違いは何ですか?
A: 「EXISTS」はサブクエリの結果が存在する場合に TRUE、「NOT EXISTS」は存在しない場合に TRUE となり、条件の意味が逆です。
Q: 主キーがある場合でも「NOT EXISTS」が推奨される理由は?
A: 主キーがあっても NULL の影響や複雑な条件に対応できるため、より安全で確実な方法だからです。

関連キーワード: 差集合, SQL, NOT EXISTS, サブクエリ, NULL対策, 主キー, 和両立
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ