DBデータベーススペシャリスト試験 午前Ⅱ

令和2年度10月 データベーススペシャリスト 午前Ⅱ 問8

問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。

問題

“社員”表に対して,SQL文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中のNULLは値が存在しないことを表す。 〔SQL文〕 SELECT 社員コード FROM 社員 X WHERE NOT EXISTS (SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司)
社員。表名「社員」の表。列は社員コード(実線の下線付きで主キー)、上司、社員名の3列。行は次の7行:S001(上司NULL,A)、S002(S001,B)、S003(S001,C)、S004(S003,D)、S005(NULL,E)、S006(S005,F)、S007(S006,G)。
社員。表名「社員」の表。列は社員コード(実線の下線付きで主キー)、上司、社員名の3列。行は次の7行:S001(上司NULL,A)、S002(S001,B)、S003(S001,C)、S004(S003,D)、S005(NULL,E)、S006(S005,F)、S007(S006,G)。
選択肢。選択肢ア〜エの結果表。見出しはどれも「社員コード」で、その下に破線がある。アはS001、S003、S005、S006。イはS001、S005。ウはS002、S004、S007。エはS003、S006。
選択肢。選択肢ア〜エの結果表。見出しはどれも「社員コード」で、その下に破線がある。アはS001、S003、S005、S006。イはS001、S005。ウはS002、S004、S007。エはS003、S006。

選択肢

  1. ア
    (問題の図表を参照)
  2. イ
    (問題の図表を参照)
  3. ウ
    (問題の図表を参照)
  4. エ
    (問題の図表を参照)
解き方のヒントを見る

別名が指す行を区別して追う

同じ表を二つの名前で参照する問合せでは、どの名前がどの行を表しているかを見失いやすくなります。具体的な行を一つ選び、手作業で条件を当てはめながら結果を確かめる姿勢で検討しましょう。

この問題で問われていること

問われているのは、問合せの記述を読み、実際のデータに対してどのような結果になるかを判断する力です。外側と内側の問合せで同じ表が使われるとき、各別名が今どの行を指しているかを意識して読み取ることが要になります。

視点

相関副問合せは、外側の問合せの行が変わるたびに、内側の条件が参照する値も変わるものとして読みます。同じ表に別名を付けて比較する場合は、条件式の左右それぞれがどちらの別名の列なのかを書き出しておくと、取り違えを防げます。存在を否定する条件では結論を急がないようにしましょう。内側で該当する行があるかないかを一行ずつ確かめてから判断します。

確認ポイント

  • 条件式に現れる各列が、どの別名に属するかを書き出したか
  • 外側の行を一つ固定したとき、内側で比較される値が何になるかを確かめたか
  • 複数の具体的な行で試し、読み取った結論が一貫しているかを見直したか
正解と解説を見る

正解

ウ

解説

副問合せは「Xの社員コードを上司列に持つ社員Y」を探します。NOT EXISTSで残るのは、誰の上司にもなっていない社員です。上司列に現れる値はS001、S003、S005、S006なので、それ以外のS002、S004、S007が結果になり、正答はウです。

理由

上司列の値はNULL、S001、S001、S003、NULL、S005、S006です。部下を持つ社員はS001、S003、S005、S006で、これらの行では副問合せが1行以上を返すため、NOT EXISTSは偽になります。S002、S004、S007は上司列に一度も出てこないので副問合せが0行となり、NOT EXISTSが真です。結果はS002、S004、S007(ウ)です。

比較

アはEXISTSにした場合の結果(部下を持つ社員)、イは上司がNULLの社員(最上位者)、エは上司がいて部下もいる社員です。どれもNOT EXISTSの条件とは合いません。また、上司列のNULLとの比較は真にならないため、結果に影響しません。

選択肢ア

これは不正解だよ。S001、S003、S005、S006は、どれも上司列に値として出てくる社員、つまり部下を持つ社員だよ。これらの行ではX.社員コード = Y.上司を満たす行Yがあるので、副問合せは1行以上を返してNOT EXISTSは偽になる。この集合はEXISTSにしたときの結果で、今回のSQLとは逆だよ。

選択肢イ

これは不正解だよ。S001とS005は上司列がNULLの社員、つまり最上位の社員だね。でもSQLが調べているのは「自分の上司がいるか」ではなく「自分が誰かの上司か」なんだ。S001はS002とS003の上司、S005はS006の上司なので、副問合せが行を返してNOT EXISTSは偽になるよ。

選択肢ウ(正解)

これは正解だよ。上司列に出てくる社員コードはS001、S003、S005、S006だけなんだ。S002、S004、S007はどの行の上司列にも出てこないので、X.社員コード = Y.上司を満たす行がなく、副問合せは0行になる。だからNOT EXISTSが真となり、この3件が結果になるよ。

選択肢エ

これは不正解だよ。S003とS006は上司を持ち、しかも自分も部下を持つ中間の立場の社員だね。S003はS004の上司、S006はS007の上司なので、副問合せが1行を返してNOT EXISTSは偽になり、結果から外れる。上司の有無は判定条件に入っていないよ。

学習のポイント

相関副問合せとEXISTS/NOT EXISTSの真偽判定、自己参照表の読み取り、NULLとの比較の扱い

出典:独立行政法人 情報処理推進機構(IPA)令和2年度10月 データベーススペシャリスト試験 午前Ⅱ 問8(公式資料:問題冊子(PDF) / 解答例)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針