相関副問合せとNOT EXISTSによる上司が存在しない社員コードの抽出

正解は「ウ」です。 提示されたSQL文の条件を読み解きます。 SELECT 社員コード FROM 社員 X WHERE NOT EXISTS  (SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司) 副問合せは「表Yの上司列に、外側の行Xの社員コードと一致する値が存在するか」を調べています。NOT EXISTS句は、副問合せの結果が0件(存在しない)のときに真となります。 したがって、この問合せは「だれの“上司”にもなっていない(部下を持たない)社員」の社員コードを取り出します。 社員表の上司列に存在する値(=だれかの上司である社員コード)を抽出すると、次の4名です。 S001(S002とS003の上司) S003(S004の上司) S005(S006の上司) S006(S007の上司) 全社員コード(S001〜S007)のうち、上司列に含まれていない(=だれの上司にもなっていない)社員コードは、S002、S004、S007 の3名です。 したがって、結果として得られるのは選択肢ウです。

“社員”表に対して,SQL文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中の“NULL”は値が存在しないことを表す。

社員

〔SQL文〕

sql
SELECT 社員コード FROM 社員 X
WHERE NOT EXISTS
 (SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司)
出典平成30年春期 午前Ⅱ
ア
S001 S003 S005 S006
イ
S001 S005
ウ
S002 S004 S007
エ
S003 S006