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


ア:
イ:
ウ:(正解)
エ:
解説
社員表に対するSQL文の結果はどれか【午前2 解説】
要点まとめ
- 結論:SQL文は「上司として誰も指定されていない社員コード」を抽出し、正解はウの社員コード一覧です。
- 根拠:
NOT EXISTS
句は「該当社員コードが他の社員の上司欄に存在しない」ことを条件にしているため、部下を持たない社員を選びます。 - 差がつくポイント:
NOT EXISTS
の意味と副問い合わせの結合条件を正確に理解し、上司と社員コードの関係を正しく把握することが重要です。
正解の理由
このSQL文は、社員テーブルの各社員コード(X)について、同じテーブルの上司欄(Y)にその社員コードが存在しない場合に抽出します。つまり、他の社員の「上司」欄に自分の社員コードがない社員、すなわち部下を持たない社員を選びます。表を見ると、社員コードS002、S004、S007は誰の上司にもなっていません。したがって、正解はウです。
よくある誤解
「上司がNULLの社員を選ぶ」と誤解しがちですが、実際は「誰の上司にもなっていない社員」を選ぶ条件です。NULLは関係ありません。
解法ステップ
- SQL文の
NOT EXISTS
の意味を理解する(副問い合わせの結果が存在しない場合)。 - 副問い合わせの条件
X.社員コード = Y.上司
を確認し、社員コードが上司欄にあるかを調べる。 - 表の「上司」列を見て、どの社員コードが上司として使われているかを特定する。
- 上司として使われていない社員コードを抽出する。
- 選択肢と照合し、該当する社員コードのリストを選ぶ。
選択肢別の誤答解説ステップ
- ア:S001、S003、S005、S006は上司として使われている社員コードが含まれており誤り。
- イ:S001、S005は上司として使われているため誤り。
- ウ:S002、S004、S007は誰の上司にもなっていないため正解。
- エ:S003、S006は上司として使われているため誤り。
補足コラム
NOT EXISTS
は副問い合わせの結果が空の場合に真となるため、存在しない条件を表現するのに便利です。今回のように自己結合的に同じテーブルを2回参照し、特定の関係性を調べるケースはよく出題されます。SQLの副問い合わせと結合の違いも理解しておくと応用が効きます。FAQ
Q:
A:
NOT EXISTS
とNOT IN
の違いは何ですか?A:
NOT EXISTS
は副問い合わせの行の存在をチェックし、NULLの影響を受けにくいのに対し、NOT IN
はNULLがあると結果が不定になることがあります。Q: NULLはこのSQL文の結果に影響しますか?
A: いいえ。NULLは「値が存在しない」ことを示しますが、このSQL文の条件は「社員コードが上司欄に存在しない」ことなので、NULLは無関係です。
A: いいえ。NULLは「値が存在しない」ことを示しますが、このSQL文の条件は「社員コードが上司欄に存在しない」ことなので、NULLは無関係です。
関連キーワード: SQL, NOT EXISTS, 副問い合わせ, 自己結合, 上司部下関係, 主キー, NULL値, データベースクエリ