令和7年度 春期 午前Ⅱ 問21
データベース
NOT EXISTSに関する問題
“従業員”表に対して,SQL 文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中の NULL は値が存在しないことを表す。
従業員
| 従業員コード | 上司 | 従業員名 |
|---|---|---|
| S001 | NULL | A |
| S002 | S001 | B |
| S003 | S001 | C |
| S004 | S003 | D |
| S005 | NULL | E |
| S006 | S005 | F |
| S007 | S006 | G |
〔SQL 文〕
SELECT 従業員コード FROM 従業員 X
WHERE NOT EXISTS
(SELECT * FROM 従業員 Y WHERE X.従業員コード = Y.上司)- ア従業員コード:S001,S003,S005,S006
- イ従業員コード:S001,S005
- ウ従業員コード:S002,S004,S007
- エ従業員コード:S003,S006
答えと解説を見る
✓ これが正解ウ従業員コード:S002,S004,S007
解説
誰の上司にもなっていない S002、S004、S007 が残ります。
この SQL 文は、従業員表 X の各行について、副問合せが1行も返さないものだけを取り出します。副問合せは、従業員表 Y のうち、上司の列が X の従業員コードと等しい行を探します。つまり、X の従業員を上司に持つ部下がいるかを調べており、NOT EXISTS によって部下が1人もいない従業員が結果に残ります。上司の列に現れる値は S001、S003、S005、S006 の4つで、これらは誰かの上司です。NULL はどの従業員コードとも等しくならないので数に入りません。残る S002、S004、S007 が結果となり、これが正解です。主キーである従業員コードの一覧から、部下を持たない組織の末端の従業員を選ぶと考えると確かめやすくなります。
ほかの選択肢はなぜ違うのか
- ア従業員コード:S001,S003,S00…:S001、S003、S005、S006 は、上司の列に現れる従業員、つまり部下を持つ従業員です。NOT を外して EXISTS とした場合の結果にあたり、否定の条件を読み落とした形です。
- イ従業員コード:S001,S005:S001 と S005 は、自分の上司の列が NULL になっている従業員です。上司を持たない最上位の者を選んだ形で、副問合せが調べている部下の有無とは別の条件で選んでいます。
- エ従業員コード:S003,S006:S003 と S006 は、部下を持つうえに自分にも上司がいる従業員です。副問合せが1行も返さない行を選ぶという条件には当てはまらず、部下がいるので結果から除かれます。
出典:令和7年度 春期 情報処理安全確保支援士試験 午前Ⅱ 問21
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)