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


ア:
イ:
ウ:(正解)
エ:
解説
社員表に対してSQL文を実行して得られる結果はどれか【午前2 解説】
要点まとめ
- 結論:SQL文は「上司として誰も指名していない社員コード」を抽出し、正解はウの「S002、S004、S007」です。
- 根拠:
NOT EXISTS
句は「社員Xが上司として社員Yに指名されていない」ことを条件にしているため、上司列に存在しない社員コードを抽出します。 - 差がつくポイント:
NOT EXISTS
の意味と自己結合の理解、NULLの扱いを正確に把握することが重要です。
正解の理由
SQL文は社員テーブルを2回参照し、外側の社員Xの社員コードが内側の社員Yの上司列に存在しない場合に抽出します。
つまり、「誰の上司にもなっていない社員コード」を選びます。
社員表の上司列にある値は「S001、S001、S003、NULL、S005、S006」です。
この中にない社員コードは「S002、S004、S007」であり、これが正解のウの結果です。
つまり、「誰の上司にもなっていない社員コード」を選びます。
社員表の上司列にある値は「S001、S001、S003、NULL、S005、S006」です。
この中にない社員コードは「S002、S004、S007」であり、これが正解のウの結果です。
よくある誤解
- NULLは「値が存在しない」ため、上司列のNULLは誰も上司にしていないことを意味しません。
NOT EXISTS
は単なる否定のIN
句とは異なり、存在しないことを確認するためのサブクエリです。
解法ステップ
- 社員テーブルの「社員コード」と「上司」列を確認する。
- 内側のサブクエリで「X.社員コード = Y.上司」の条件を満たす行を探す。
- 外側の社員Xの社員コードが内側の上司列に存在しない場合を抽出する。
- 上司列に存在しない社員コードをリストアップする。
- 選択肢と照合し、該当する社員コードを選ぶ。
選択肢別の誤答解説
- ア:上司列に存在する社員コードも含まれており、条件に合致しません。
- イ:上司列に存在する「S001」「S005」のみで、上司になっている社員コードを抽出している誤りです。
- ウ:正解。上司列に存在しない社員コード「S002」「S004」「S007」を正しく抽出しています。
- エ:一部上司列に存在する社員コード「S003」「S006」が含まれており誤りです。
補足コラム
NOT EXISTS
はSQLで「存在しないこと」を判定する強力な条件句です。自己結合を用いて同じテーブルの異なる行を比較する際に頻出します。
NULLの扱いは特に注意が必要で、NULL同士の比較はFALSEになるため、NULLは存在しないとみなされません。
FAQ
Q:
A:
NOT EXISTS
とNOT IN
の違いは何ですか?A:
NOT EXISTS
はサブクエリの行の存在をチェックし、NULLの影響を受けにくいのに対し、NOT IN
はNULLがあると結果が不確定になることがあります。Q: NULLが上司列にある場合、どう扱えばよいですか?
A: NULLは「上司がいない」ことを示し、比較条件には含まれません。NULLは等価比較でFALSEとなるため、存在チェックには影響しません。
A: NULLは「上司がいない」ことを示し、比較条件には含まれません。NULLは等価比較でFALSEとなるため、存在チェックには影響しません。
関連キーワード: SQL, NOT EXISTS, 自己結合, NULL, 主キー, サブクエリ, データベース, 抽出条件