データベーススペシャリスト試験 2020年 午前208


社員表に対してSQL文を実行して得られる結果はどれか。実線の下線は主キーを表し、表中のNULLは値が存在しないことを表す。
問題画像選択肢画像
(正解)

解説

社員表に対してSQL文を実行して得られる結果はどれか【午前2 解説】

要点まとめ

  • 結論:SQL文は「上司として誰も指名していない社員コード」を抽出し、正解はウの「S002、S004、S007」です。
  • 根拠:NOT EXISTS句は「社員Xが上司として社員Yに指名されていない」ことを条件にしているため、上司列に存在しない社員コードを抽出します。
  • 差がつくポイント:NOT EXISTSの意味と自己結合の理解、NULLの扱いを正確に把握することが重要です。

正解の理由

SQL文は社員テーブルを2回参照し、外側の社員Xの社員コードが内側の社員Yの上司列に存在しない場合に抽出します。
つまり、「誰の上司にもなっていない社員コード」を選びます。
社員表の上司列にある値は「S001、S001、S003、NULL、S005、S006」です。
この中にない社員コードは「S002、S004、S007」であり、これが正解のウの結果です。

よくある誤解

  • NULLは「値が存在しない」ため、上司列のNULLは誰も上司にしていないことを意味しません。
  • NOT EXISTSは単なる否定のIN句とは異なり、存在しないことを確認するためのサブクエリです。

解法ステップ

  1. 社員テーブルの「社員コード」と「上司」列を確認する。
  2. 内側のサブクエリで「X.社員コード = Y.上司」の条件を満たす行を探す。
  3. 外側の社員Xの社員コードが内側の上司列に存在しない場合を抽出する。
  4. 上司列に存在しない社員コードをリストアップする。
  5. 選択肢と照合し、該当する社員コードを選ぶ。

選択肢別の誤答解説

  • ア:上司列に存在する社員コードも含まれており、条件に合致しません。
  • イ:上司列に存在する「S001」「S005」のみで、上司になっている社員コードを抽出している誤りです。
  • ウ:正解。上司列に存在しない社員コード「S002」「S004」「S007」を正しく抽出しています。
  • エ:一部上司列に存在する社員コード「S003」「S006」が含まれており誤りです。

補足コラム

NOT EXISTSはSQLで「存在しないこと」を判定する強力な条件句です。
自己結合を用いて同じテーブルの異なる行を比較する際に頻出します。
NULLの扱いは特に注意が必要で、NULL同士の比較はFALSEになるため、NULLは存在しないとみなされません。

FAQ

Q: NOT EXISTSNOT INの違いは何ですか?
A: NOT EXISTSはサブクエリの行の存在をチェックし、NULLの影響を受けにくいのに対し、NOT INはNULLがあると結果が不確定になることがあります。
Q: NULLが上司列にある場合、どう扱えばよいですか?
A: NULLは「上司がいない」ことを示し、比較条件には含まれません。NULLは等価比較でFALSEとなるため、存在チェックには影響しません。

関連キーワード: SQL, NOT EXISTS, 自己結合, NULL, 主キー, サブクエリ, データベース, 抽出条件
← 前の問題へ次の問題へ →

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