令和7年春期試験問題 午前Ⅱ 問21
問21解説へ
"従業員"表に対して,SQL文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中のNULLは値が存在しないことを表す。
〔SQL文〕

SELECT 従業員コード FROM 従業員 X
WHERE NOT EXISTS
(SELECT * FROM 従業員 Y WHERE X.従業員コード = Y.上司)
WHERE NOT EXISTS
(SELECT * FROM 従業員 Y WHERE X.従業員コード = Y.上司)
正解 ウ問題へ
分野 :テクノロジ系
中分類:データベース
小分類:データ操作
中分類:データベース
小分類:データ操作
広告
解説
このSQL文では、副問合せ中に主問合せ側のX表の"従業員コード"の値が使用されているため、相関副問合せになります。相関副問合せでは、主問合せ側の1行ごとに副問合せのSQL文が実行されていきます。最初から順を追って説明していくので、相関副問合せがどのように処理されていくのかを確実に把握しておきましょう。
まず1行目から考えていきます。副問合せの「X.従業員コード」の部分には、現在処理中の1行目の"従業員コード"の値であるS001が代入されます。
次に2行目について考えていきます。副問合せの「X.従業員コード」の部分には、現在処理中の2行目の"従業員コード"の値であるS002が代入されます。
この2つのケースを見ると、主問合せ側のWHERE句は、その"従業員コード"がいずれかの行の"上司"に設定されている場合は偽、されていない場合には真を返すことがわかります。そのため、設問のSQL文を実行した場合、どの従業員の上司にもなっていない従業員コードである「S002、S004、S007」の3行が抽出されます。
したがって「ウ」が正解です。
まず1行目から考えていきます。副問合せの「X.従業員コード」の部分には、現在処理中の1行目の"従業員コード"の値であるS001が代入されます。
SELECT * FROM 従業員 Y
WHERE S001 = Y.上司
この副問合せは、従業員表から"上司"列の値がS001である行を抽出します。つまり、従業員表のうち"従業員コード"の値がS002及びS003の2つの行から成る結果セットが返されます。主問合せのWHERE句ではNOT EXISTS、すなわち副問合せの結果が0行となる場合に真を返すため、1行目は偽と判定され抽出対象になりません。WHERE S001 = Y.上司
次に2行目について考えていきます。副問合せの「X.従業員コード」の部分には、現在処理中の2行目の"従業員コード"の値であるS002が代入されます。
SELECT * FROM 従業員 Y
WHERE S002 = Y.上司
この副問合せは、従業員表から"上司"列の値がS002である行を抽出します。従業員表には"上司"の値がS002である行は存在しないので、結果セットは0行になります。結果セットが0行なので、2行目はNOT EXISTSで真と判定され抽出対象になります。WHERE S002 = Y.上司
この2つのケースを見ると、主問合せ側のWHERE句は、その"従業員コード"がいずれかの行の"上司"に設定されている場合は偽、されていない場合には真を返すことがわかります。そのため、設問のSQL文を実行した場合、どの従業員の上司にもなっていない従業員コードである「S002、S004、S007」の3行が抽出されます。
したがって「ウ」が正解です。
広告