情報処理安全確保支援士 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」が最も適切です。
この条件をSQLで表す際、サブクエリでSに該当する行が存在しないことを確認する必要があります。
「NOT EXISTS」はサブクエリの結果が空であることを判定し、NULL値の影響を受けずに正確に差集合を表現できます。
したがって、選択肢の中で「イ: NOT EXISTS」が最も適切です。
解法ステップ
- 差集合R-Sの意味を理解する(RにあってSにない行)。
- サブクエリでSの該当行を検索し、存在しないことを条件にする。
- NULLの影響を考慮し、「NOT EXISTS」を使う。
- SQL 文に「WHERE NOT EXISTS (サブクエリ)」を記述する。
- 主キーやNULL制約を確認し、正確な条件を設定する。
選択肢別の誤答解説
- ア: EXISTS
→ サブクエリの結果が存在する行を抽出するため、差集合の条件と逆になります。 - イ: NOT EXISTS
→ サブクエリの結果が存在しない行を抽出し、差集合を正しく表現します。 - ウ: NOT IN
→ NULL値がある場合に結果が不正確になる可能性があり、今回の条件では不適切です。 - エ: R.ID NOT IN
→ 「R.ID NOT IN」とだけ書くのは不完全で、サブクエリの条件が不足しており誤りです。
よくある誤解
「NOT IN」を使うとNULL値がある場合に意図しない結果になることがあります。
また、「EXISTS」は存在する行を抽出するため、差集合には不適切です。
また、「EXISTS」は存在する行を抽出するため、差集合には不適切です。
補足コラム
SQLにおける差集合は「EXCEPT」句で簡潔に表現できますが、和両立の表やNULL制約がある場合は「NOT EXISTS」を使う方法が汎用的で安全です。
また、パフォーマンス面ではインデックスの有無やデータ量によって「NOT EXISTS」と「NOT IN」の効果が変わるため、実際の環境に応じて使い分けることも重要です。
また、パフォーマンス面ではインデックスの有無やデータ量によって「NOT EXISTS」と「NOT IN」の効果が変わるため、実際の環境に応じて使い分けることも重要です。
FAQ
Q: なぜ「NOT IN」はNULL値に弱いのですか?
A: 「NOT IN」はサブクエリの結果にNULLが含まれると比較が不定(UNKNOWN)となり、意図した行が除外されることがあります。
A: 「NOT IN」はサブクエリの結果にNULLが含まれると比較が不定(UNKNOWN)となり、意図した行が除外されることがあります。
Q: 「EXISTS」と「NOT EXISTS」の違いは何ですか?
A: 「EXISTS」はサブクエリの結果が存在する場合に TRUE、「NOT EXISTS」は存在しない場合に TRUE となり、条件の意味が逆です。
A: 「EXISTS」はサブクエリの結果が存在する場合に TRUE、「NOT EXISTS」は存在しない場合に TRUE となり、条件の意味が逆です。
Q: 主キーがある場合でも「NOT EXISTS」が推奨される理由は?
A: 主キーがあってもNULLの影響や複雑な条件に対応できるため、より安全で確実な方法だからです。
A: 主キーがあってもNULLの影響や複雑な条件に対応できるため、より安全で確実な方法だからです。
関連キーワード: 差集合、SQL, NOT EXISTS, サブクエリ、NULL対策、主キー、和両立

\ せっかくなら /
情報処理安全確保支援士を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

