戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

情報処理安全確保支援士 2010年 秋期 午前2 問21


問題文

和両立である表 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

🔒 解説は解答すると表示されます

差集合のSQL条件指定【午前2解説】

正解の理由

差集合R-Sは「Rに存在するがSに存在しない」行を抽出する操作です。
この条件をSQLで表す際、サブクエリでSに該当する行が存在しないことを確認する必要があります。
「NOT EXISTS」はサブクエリの結果が空であることを判定し、NULL値の影響を受けずに正確に差集合を表現できます。
したがって、選択肢の中で「イ: NOT 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」とだけ書くのは不完全で、サブクエリの条件が不足しており誤りです。

よくある誤解

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

補足コラム

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対策、主キー、和両立
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

情報処理安全確保支援士を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

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

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について