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

データベーススペシャリスト 2011年 午前205


問題文

“社員番号” と “氏名” を列としてもつR表とS表に対して、差 (R-S) を求めるSQL 文はどれか。ここで、R 表とS 表の主キーは“社員番号”であり、“氏名”は“社員番号”に関数従属する。

選択肢

SELECT R.社員番号、 S.氏名 FROM R, S
  WHERE R. 社員番号 <> S. 社員番号
SELECT 社員番号、 氏名 FROM R
  UNION SELECT 社員番号、 氏名 FROM S
SELECT 社員番号、 氏名 FROM R
  WHERE NOT EXISTS (SELECT FROM S
    WHERE R. 社員番号 = S. 社員番号)
(正解)
SELECT 社員番号、 氏名 FROM S
  WHERE S.社員番号 NOT IN (SELECT 社員番号 FROM R
    WHERE R.社員番号= S.社員番号)

“社員番号” と “氏名” を列としてもつR表とS表に対して、差 (R-S) を求めるSQL 文はどれか【午前2 解説】

要点まとめ

  • 結論:R表に存在しS表に存在しない社員番号の行を抽出するには、NOT EXISTS句を使うSQL文が正解です。
  • 根拠:差集合(R-S)は「Rの行のうちSに存在しないもの」を意味し、主キーである社員番号を基に存在チェックを行う必要があります。
  • 差がつくポイント:単純な結合やUNIONでは差集合は表現できず、NOT EXISTSやNOT INで存在しない行を正確に抽出する理解が重要です。

正解の理由

選択肢ウは、R表の各行に対してS表に同じ社員番号が存在しないことを
NOT EXISTS
で確認しています。これにより、R表にあってS表にない行だけを抽出でき、差集合(R-S)を正しく求めています。主キーである社員番号を条件にしているため、氏名の関数従属性も問題になりません。

よくある誤解

  • 単純な結合条件で差集合を求められると誤解しがちですが、結合は共通部分や全体集合を扱うため差集合には不向きです。
  • UNIONは集合の和集合を求めるため、差集合とは逆の結果になります。

解法ステップ

  1. 差集合とは「RにあってSにない」行の集合であることを理解する。
  2. 主キーである社員番号を基準に、S表に存在しない社員番号をR表から抽出する必要がある。
  3. SQLで存在チェックを行う方法として
    NOT EXISTS
    NOT IN
    があることを確認する。
  4. 選択肢のSQL文を読み、R表の行に対してS表に同じ社員番号が存在しないことを条件にしている文を選ぶ。
  5. それが選択肢ウであることを判断する。

選択肢別の誤答解説

  • ア:
    WHERE R.社員番号 <> S.社員番号
    は全ての社員番号が異なる組み合わせを抽出し、差集合とは無関係な結果になる。
  • イ:
    UNION
    はRとSの和集合を求めるため、差集合の条件を満たさない。
  • ウ: 正解。RにあってSにない社員番号を
    NOT EXISTS
    で正しく抽出している。
  • エ: S表からR表に存在しない社員番号を抽出しており、差集合の方向が逆(S-R)になっている。

補足コラム

SQLで集合演算を行う際、差集合は
EXCEPT
句を使うこともありますが、全てのDBMSでサポートされているわけではありません。
NOT EXISTS
NOT IN
は互換性が高く、主キーを使った存在チェックに適しています。また、NULL値の扱いに注意が必要で、
NOT IN
はNULLが含まれると意図しない結果になることがあります。

FAQ

Q: 差集合を求めるのに
NOT IN
NOT EXISTS
はどちらが良いですか?
A: 一般的に
NOT EXISTS
の方がNULLの影響を受けにくく、パフォーマンスも良い場合が多いです。
Q: 主キー以外の列で差集合を求めることはできますか?
A: 可能ですが、主キー以外の列で比較すると重複や不整合が起きやすいため、主キーを基準にするのが安全です。

関連キーワード: SQL 差集合、NOT EXISTS, 主キー、集合演算、SQL文解説
← 前の問題へ次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

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

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