戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2020年 午前2 問08


問題文

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

選択肢

ア:
イ:
ウ:(正解)
エ:

🔒 解説は解答すると表示されます

NOT EXISTSとNULL【午前2解説】

正解の理由

サブクエリで「X.社員コード = Y.上司」と等価比較しているため、外側の各社員 X について、上司列に自分の社員コードと一致する行が存在するか(=誰かの上司になっているか)を判定しています。等価比較で NULL と比較すると結果は TRUE にならず(UNKNOWN と扱われ、WHERE 句では一致しない)、したがって上司列の NULL は「その行の社員に上司がいないこと」を示す一方で、ある社員が誰かの上司であるかどうかの判定には影響しません。社員コードが上司列に現れない社員、すなわち誰の上司でもない社員だけが外側の NOT EXISTS 条件を満たします。
表中で上司として現れている社員コードはS001、S003、S005、S006です。これらを除いた社員コードはS002、S004、S007であり、これは選択肢ウの並びと一致します。

解法ステップ

  1. サブクエリの条件X.社員コード = Y.上司 が意味することを確認する(Xが誰かの上司かのチェック)。
  2. 上司列の値一覧からNULLを除いた非NULL値を抽出する(NULLは等価比較で不一致となるため、上司であることの判定には含まれない)。
  3. 外側の各Xについて、サブクエリに該当行が存在しなければ NOT EXISTS は真となり、そのXの社員コードが結果に含まれる。
  4. 表の上司列に現れない社員コードを列挙する: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. その行の社員が上司を持たない(上司が登録されていない)ことを示します。これは「誰かの上司になっていない」という意味とは別です。
Q2. NULLを含む場合、NOT IN は使えますか?
A2. サブクエリがNULLを返す可能性がある場合、NOT IN は期待どおり動かないことがあります。NULLがあると比較はUNKNOWNになり、結果が空になる場合があるため、NULLを除外するか NOT EXISTS を使うことが推奨されます。
Q3. 等価比較でNULLが真にならない理由は?
A3. SQL の三値論理では NULL は「未知」を表し、未知との等価比較は TRUE でも FALSE でもなく UNKNOWN になるため、WHERE 句では選択条件を満たさない扱いになります。

関連キーワード: SQL、NULL、NOT EXISTS、副問い合わせ、自己結合、NOT IN、LEFT JOIN、比較演算子、三値論理、存在判定
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリストを
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について