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


ア:
イ:
ウ:(正解)
エ:
解説
社員表に対するSQL文の結果はどれか【午前2 解説】
要点まとめ
- 結論:SQL文は「上司として登録されていない社員コード」を抽出し、正解はウの社員コードS002、S004、S007です。
- 根拠:
NOT EXISTS
句は、社員コードが他の社員の「上司」列に存在しないことを条件にしているため、上司でない社員を抽出します。 - 差がつくポイント:自己結合の理解と
NOT EXISTS
の使い方、NULLの扱いに注意し、上司としての役割があるかどうかを正確に判断することが重要です。
正解の理由
このSQL文は、社員表を自己結合し、社員コードが他の社員の「上司」列に存在しない社員を抽出しています。つまり、誰の上司にもなっていない社員コードを選びます。
表のデータを見ると、上司として名前が挙がっているのはS001、S003、S005、S006です。これらは他の社員の「上司」列に存在します。
一方、S002、S004、S007は誰の上司にもなっていません。したがって、これらの社員コードが抽出され、選択肢ウが正解です。
表のデータを見ると、上司として名前が挙がっているのはS001、S003、S005、S006です。これらは他の社員の「上司」列に存在します。
一方、S002、S004、S007は誰の上司にもなっていません。したがって、これらの社員コードが抽出され、選択肢ウが正解です。
よくある誤解
「上司がNULLの社員が抽出される」と誤解しがちですが、SQL文は「上司として登録されていない社員」を抽出するため、NULLは直接関係ありません。
また、
また、
NOT EXISTS
の意味を「存在しない行を除外する」と誤解し、逆の結果を選ぶことも多いです。解法ステップ
- SQL文の
FROM 社員 X
とFROM 社員 Y
の自己結合を理解する。 WHERE X.社員コード = Y.上司
の条件で、Xの社員コードがYの上司として存在するかを確認。NOT EXISTS
で「Xの社員コードが上司として存在しない」社員を抽出。- 表の「上司」列を確認し、上司として名前がある社員コードをリストアップ。
- 上司として名前がない社員コードを選択肢から探す。
選択肢別の誤答解説
- ア:S001、S003、S005、S006は全て誰かの上司なので抽出されません。
- イ:S001、S005は上司として存在します。抽出対象外です。
- ウ:S002、S004、S007は誰の上司にもなっていないため正解です。
- エ:S003、S006は上司として存在するため誤りです。
補足コラム
自己結合は同じテーブルを2回以上参照し、異なるエイリアスを付けて比較する手法です。
NULL値は比較に注意が必要ですが、今回のSQLではNULLは「上司」列にあるだけで、
NOT EXISTS
はサブクエリの結果が空の場合に真となり、存在しない条件を表現します。NULL値は比較に注意が必要ですが、今回のSQLではNULLは「上司」列にあるだけで、
X.社員コード = Y.上司
の比較には影響しません。FAQ
Q:
A:
NOT EXISTS
とNOT IN
の違いは何ですか?A:
NOT EXISTS
はサブクエリの行の存在をチェックし、NULLの影響を受けにくいのに対し、NOT IN
はNULLがあると結果が不確定になることがあります。Q: NULLが「上司」列にある場合、どう扱われますか?
A: NULLは「値が存在しない」ことを示し、比較条件
A: NULLは「値が存在しない」ことを示し、比較条件
X.社員コード = Y.上司
ではFALSE扱いとなるため、NULLは上司としてカウントされません。関連キーワード: SQL, 自己結合, NOT EXISTS, 主キー, NULL, 上司, 抽出条件, データベース, クエリ解析