令和4年度 秋期 データベーススペシャリスト試験 午前II 問8

“社員”表に対して,SQL文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中の NULL は値が存在しないことを表す。

〔SQL文〕

SELECT 社員コード FROM 社員 X
    WHERE NOT EXISTS
        (SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司)
社員表
図の説明テキスト

社員

社員コード 上司 社員名
S001 NULL A
S002 S001 B
S003 S001 C
S004 S003 D
S005 NULL E
S006 S005 F
S007 S006 G
解答・解説

正解: ウ. text 社員コード ---------- S002 S004 S007

提示されたSQL文は、相関サブクエリを用いて「部下を持たない社員」を抽出する処理を行っています。

SQL文の構造と処理の解釈

  1. サブクエリ部分: (SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司)
    主キー側である社員Xの社員コードと、外部キー側である社員Yの「上司」列を結合しています。つまり、「社員Xを上司とする社員Y(=Xの部下)」を検索しています。

  2. EXISTS句: WHERE NOT EXISTS (...)
    EXISTS はサブクエリが1件以上の行を返す場合に真(TRUE)となります。今回は NOT EXISTS となっているため、「サブクエリが1行も返さない(=部下が1人も存在しない)」場合に真となります。

したがって、このSQL文は「誰の上司でもない(部下がいない)社員」の社員コードを取得します。

各選択肢の解説

  • ア: 不正解。抽出条件と合致しない社員(S001, S003, S005, S006など、上司として登録されている社員)が含まれていると考えられます。
  • イ: 不正解。別の条件に基づく抽出結果であり、本SQL文の意図とは異なります。
  • ウ: 正解。上司列に自らの社員コードが存在しない(=部下がいない)社員のコード(S002, S004, S007)のみが正しく抽出されています。
  • エ: 不正解。抽出条件と合致しない一部の社員コードの組み合わせであり、誤りです。

Spineチーム