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


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

解説

社員表に対するSQL文の結果はどれか【午前2 解説】

要点まとめ

  • 結論:SQL文は「上司として登録されていない社員コード」を抽出し、正解はウの社員コードS002、S004、S007です。
  • 根拠:NOT EXISTS句は、社員コードが他の社員の「上司」列に存在しないことを条件にしているため、上司でない社員を抽出します。
  • 差がつくポイント:自己結合の理解とNOT EXISTSの使い方、NULLの扱いに注意し、上司としての役割があるかどうかを正確に判断することが重要です。

正解の理由

このSQL文は、社員表を自己結合し、社員コードが他の社員の「上司」列に存在しない社員を抽出しています。つまり、誰の上司にもなっていない社員コードを選びます。
表のデータを見ると、上司として名前が挙がっているのはS001、S003、S005、S006です。これらは他の社員の「上司」列に存在します。
一方、S002、S004、S007は誰の上司にもなっていません。したがって、これらの社員コードが抽出され、選択肢ウが正解です。

よくある誤解

「上司がNULLの社員が抽出される」と誤解しがちですが、SQL文は「上司として登録されていない社員」を抽出するため、NULLは直接関係ありません。
また、NOT EXISTSの意味を「存在しない行を除外する」と誤解し、逆の結果を選ぶことも多いです。

解法ステップ

  1. SQL文のFROM 社員 XFROM 社員 Yの自己結合を理解する。
  2. WHERE X.社員コード = Y.上司の条件で、Xの社員コードがYの上司として存在するかを確認。
  3. NOT EXISTSで「Xの社員コードが上司として存在しない」社員を抽出。
  4. 表の「上司」列を確認し、上司として名前がある社員コードをリストアップ。
  5. 上司として名前がない社員コードを選択肢から探す。

選択肢別の誤答解説

  • ア:S001、S003、S005、S006は全て誰かの上司なので抽出されません。
  • イ:S001、S005は上司として存在します。抽出対象外です。
  • ウ:S002、S004、S007は誰の上司にもなっていないため正解です。
  • エ:S003、S006は上司として存在するため誤りです。

補足コラム

自己結合は同じテーブルを2回以上参照し、異なるエイリアスを付けて比較する手法です。
NOT EXISTSはサブクエリの結果が空の場合に真となり、存在しない条件を表現します。
NULL値は比較に注意が必要ですが、今回のSQLではNULLは「上司」列にあるだけで、X.社員コード = Y.上司の比較には影響しません。

FAQ

Q: NOT EXISTSNOT INの違いは何ですか?
A: NOT EXISTSはサブクエリの行の存在をチェックし、NULLの影響を受けにくいのに対し、NOT INはNULLがあると結果が不確定になることがあります。
Q: NULLが「上司」列にある場合、どう扱われますか?
A: NULLは「値が存在しない」ことを示し、比較条件X.社員コード = Y.上司ではFALSE扱いとなるため、NULLは上司としてカウントされません。

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

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