データベーススペシャリスト 2020年 午前2 問08
問題文
社員表に対してSQL文を実行して得られる結果はどれか。実線の下線は主キーを表し、表中のNULLは値が存在しないことを表す。


選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
NOT EXISTSとNULL【午前2解説】
正解の理由
サブクエリで「X.社員コード = Y.上司」と等価比較しているため、外側の各社員 X について、上司列に自分の社員コードと一致する行が存在するか(=誰かの上司になっているか)を判定しています。等価比較で NULL と比較すると結果は TRUE にならず(UNKNOWN と扱われ、WHERE 句では一致しない)、したがって上司列の NULL は「その行の社員に上司がいないこと」を示す一方で、ある社員が誰かの上司であるかどうかの判定には影響しません。社員コードが上司列に現れない社員、すなわち誰の上司でもない社員だけが外側の NOT EXISTS 条件を満たします。
表中で上司として現れている社員コードは S001、S003、S005、S006 です。これらを除いた社員コードは S002、S004、S007 であり、これは選択肢ウの並びと一致します。
解法ステップ
- サブクエリの条件 X.社員コード = Y.上司 が意味することを確認する(X が誰かの上司かのチェック)。
- 上司列の値一覧から NULL を除いた非 NULL 値を抽出する(NULL は等価比較で不一致となるため、上司であることの判定には含まれない)。
- 外側の各 X について、サブクエリに該当行が存在しなければ NOT EXISTS は真となり、その X の社員コードが結果に含まれる。
- 表の上司列に現れない社員コードを列挙する:S002、S004、S007。
選択肢別の誤答解説
-
ア(S001, S003, S005, S006)
これらは「誰かの上司になっている」社員コードのリストです。だが問題の WHERE は NOT EXISTS(誰の上司でもない)を要求しているため逆になります。 -
イ(S001, S005)
これは上司列が NULL の行(上司を持たない社員)を取り出したリストに似ています。上司が NULL の社員と「誰の上司でもない社員」は別概念です。本問は「誰の上司でもない社員」を求めており、上司が NULL の社員だけではありません。 -
ウ(S002, S004, S007)
本問の条件に一致する「誰の上司でもない社員」の集合であり正答です。 -
エ(S003, S006)
部分的に上司になっている社員のリストで、NOT EXISTS 条件の逆の要素を含んでいます。誤りです。
よくある誤解
- NULL を「比較の対象外」や「空文字として扱う」と誤認する。実際には NULL との等価比較は UNKNOWN になり、WHERE 句では TRUE とみなされないため一致しない扱いになります。
- 「上司列が NULL の社員=誰の上司でもない社員」と混同する。上司列が NULL なのはその行の社員が上司を持たないことを示しますが、"誰かの上司であるか"は上司列にその社員コードが現れるかで判断します(NULL ではない値の出現を確認する必要があります)。
- NOT EXISTS と NOT IN を同じ安全性で使えると考える。NOT IN はサブクエリ側に NULL があると期待通り動かない場合があり注意が必要です。
補足コラム
- NOT EXISTS はサブクエリが「1行でも返すかどうか」を判断するので、NULL の存在は直接的にサブクエリの一致行を作らない限り影響しません。一方、NOT IN は集合演算においてサブクエリ結果に NULL が含まれると比較全体が UNKNOWN になり、結果が空になる(想定外の挙動)ことがあります。
- 同じ結果を別手法で得る例:
-- NOT EXISTS と同等(LEFT JOIN を使う)
SELECT X.社員コード
FROM 社員 X
LEFT JOIN 社員 Y ON X.社員コード = Y.上司
WHERE Y.上司 IS NULL;
ただしこの書き方は JOIN の後で NULL を判定することで等価性を実現しており、NULL 比較の扱いに注意が必要です。
FAQ
Q1. 上司列の NULL は何を意味しますか?
A1. その行の社員が上司を持たない(上司が登録されていない)ことを示します。これは「誰かの上司になっていない」という意味とは別です。
A1. その行の社員が上司を持たない(上司が登録されていない)ことを示します。これは「誰かの上司になっていない」という意味とは別です。
Q2. NULL を含む場合、NOT IN は使えますか?
A2. サブクエリが NULL を返す可能性がある場合、NOT IN は期待どおり動かないことがあります。NULL があると比較は UNKNOWN になり、結果が空になる場合があるため、NULL を除外するか NOT EXISTS を使うことが推奨されます。
A2. サブクエリが NULL を返す可能性がある場合、NOT IN は期待どおり動かないことがあります。NULL があると比較は UNKNOWN になり、結果が空になる場合があるため、NULL を除外するか NOT EXISTS を使うことが推奨されます。
Q3. 等価比較で NULL が真にならない理由は?
A3. SQL の三値論理では NULL は「未知」を表し、未知との等価比較は TRUE でも FALSE でもなく UNKNOWN になるため、WHERE 句では選択条件を満たさない扱いになります。
A3. SQL の三値論理では NULL は「未知」を表し、未知との等価比較は TRUE でも FALSE でもなく UNKNOWN になるため、WHERE 句では選択条件を満たさない扱いになります。
関連キーワード: SQL、NULL、NOT EXISTS、副問い合わせ、自己結合、NOT IN、LEFT JOIN、比較演算子、三値論理、存在判定

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

