令和7年度 春期 情報処理安全確保支援士試験 午前II 問21

“従業員”表に対して,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
※従業員コードの列名には下線(主キー)が引かれている。
解答・解説

正解: ウ.

NOT EXISTS句とは

相関サブクエリ(副問合せ)を用いた条件判定の一つです。副問合せの結果が1行も返されない場合に真(TRUE)となります。

正解の根拠

与えられたSQL文の意味を読み解きます。

SELECT 従業員コード FROM 従業員 X
    WHERE NOT EXISTS
        (SELECT * FROM 従業員 Y WHERE X.従業員コード = Y.上司)

副問合せ SELECT * FROM 従業員 Y WHERE X.従業員コード = Y.上司 は、「従業員Yの『上司』列に、従業員Xの『従業員コード』が存在する行」を抽出します。これは、従業員Xが誰かの上司として登録されている場合に該当します。

WHERE句の条件は NOT EXISTS なので、「副問合せの結果が存在しない」、すなわち「誰の上司でもない(部下がいない)」従業員の従業員コードを抽出する処理になります。

表「従業員」の「上司」列に含まれている従業員コードを確認します。

  • S001(S002とS003の上司)
  • S003(S004の上司)
  • S005(S006の上司)
  • S006(S007の上司)

したがって、S001、S003、S005、S006の4名は誰かの上司であるため、条件に一致しません。
「上司」列に一度も登場しない従業員コードは以下のとおりです。

  • S002
  • S004
  • S007

この3名が抽出されるため、正解は「ウ」となります。

各選択肢の解説

  • ア: 部下を持つ(誰かの上司である)従業員コードを抽出した結果です。WHERE句が EXISTS であった場合に得られます。
  • イ: 「上司」列がNULLである(上司がいない)従業員コードを抽出した結果です。WHERE句が 上司 IS NULL であった場合に得られます。
  • ウ: 正解です。
  • エ: 上司が設定されており、かつ自身も誰かの上司である従業員コードを抽出した結果です。

Spineチーム