令和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文の構造と処理の解釈
サブクエリ部分:
(SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司)
主キー側である社員Xの社員コードと、外部キー側である社員Yの「上司」列を結合しています。つまり、「社員Xを上司とする社員Y(=Xの部下)」を検索しています。EXISTS句:
WHERE NOT EXISTS (...)EXISTSはサブクエリが1件以上の行を返す場合に真(TRUE)となります。今回はNOT EXISTSとなっているため、「サブクエリが1行も返さない(=部下が1人も存在しない)」場合に真となります。
したがって、このSQL文は「誰の上司でもない(部下がいない)社員」の社員コードを取得します。
各選択肢の解説
- ア: 不正解。抽出条件と合致しない社員(S001, S003, S005, S006など、上司として登録されている社員)が含まれていると考えられます。
- イ: 不正解。別の条件に基づく抽出結果であり、本SQL文の意図とは異なります。
- ウ: 正解。上司列に自らの社員コードが存在しない(=部下がいない)社員のコード(S002, S004, S007)のみが正しく抽出されています。
- エ: 不正解。抽出条件と合致しない一部の社員コードの組み合わせであり、誤りです。