令和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であった場合に得られます。 - ウ: 正解です。
- エ: 上司が設定されており、かつ自身も誰かの上司である従業員コードを抽出した結果です。



