問21 NOT EXISTS の結果

情報処理​安全確保​支援士 令和7年度 春期 午前II、全25問のうちの問21。

出典:令和7年度 春期 情報処理安全確保支援士試験 午前II 問21(表は原本の画像を文字に書き起こし、主キーの下線は列の名前のあとに「(主キー)」と書いた。SQL 文は字下げを省いて問題文に入れ、選択肢の表 (列は従業員コード) は値を並べた文にした)

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

〔SQL 文〕

SELECT 従業員コード FROM 従業員 X

WHERE NOT EXISTS

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

従業員
従業員コード (主キー)上司従業員名
S0⁠0⁠1NULLA
S0⁠0⁠2S0⁠0⁠1B
S0⁠0⁠3S0⁠0⁠1C
S0⁠0⁠4S0⁠0⁠3D
S0⁠0⁠5NULLE
S0⁠0⁠6S0⁠0⁠5F
S0⁠0⁠7S0⁠0⁠6G
  1. アS0⁠0⁠1,S0⁠0⁠3,S0⁠0⁠5,S0⁠0⁠6
  2. イS0⁠0⁠1,S0⁠0⁠5
  3. ウS0⁠0⁠2,S0⁠0⁠4,S0⁠0⁠7
  4. エS0⁠0⁠3,S0⁠0⁠6
答えと解説を開く

正解はウです。

この SQL 文は、従業員 X の 1 行ごとに「X を上司とする従業員 Y がいるか」を調べ、1 人もいない X の従業員コードだけを出します。上司の列に出てくるのは、S0⁠0⁠1 (B と C の上司)、S0⁠0⁠3 (D の上司)、S0⁠0⁠5 (F の上司)、S0⁠0⁠6 (G の上司) です。だれの上司にもなっていないのは S0⁠0⁠2、S0⁠0⁠4、S0⁠0⁠7 なので、正解はウです。

ほかの選択肢が違う理由

  • アS0⁠0⁠1、S0⁠0⁠3、S0⁠0⁠5、S0⁠0⁠6 は、だれかの上司になっている従業員です。NOT EXISTS ではなく EXISTS にしたときの結果です。
  • イS0⁠0⁠1 と S0⁠0⁠5 は、上司の列が NULL の従業員、つまりいちばん上の人です。この SQL 文は上司がいるかではなく、部下がいるかを調べています。
  • エS0⁠0⁠3 と S0⁠0⁠6 は、上司がいて、部下もいる、間の立場の従業員です。どちらも部下がいるので、NOT EXISTS の条件で外れます。

仕組み

かっこの中の SELECT は、外の X の値を使って 1 行ごとに実行し直されます。このような問い合わせを相関副問合せと呼びます。NOT EXISTS は、中の SELECT が 1 行も返さないときに真になります。

同じことを NOT IN で書くと、落とし穴があります。上司の列には NULL があるので、「従業員コード NOT IN (SELECT 上司 FROM 従業員)」と書くと、比べた結果がどれも真にならず、1 行も返りません。NULL を含みうる列で「含まれない」を調べるときは、NOT EXISTS が安全です。

この問に出る言葉