基本情報技術者試験「副問合せ」の問題
SQLで `SELECT 名前 FROM 社員 WHERE 部署ID IN (SELECT 部署ID FROM 部署 WHERE 所在地='東京')` を実行した。この問合せが返す結果として正しいものはどれか。
ア所在地が東京以外の部署に属する社員の名前
イ所在地が東京の部署に属する社員の名前
ウ全社員の名前を部署にかかわらず返す
エ部署表の所在地が東京の行の所在地名
正解
イ.所在地が東京の部署に属する社員の名前
内側の副問合せは所在地が東京の部署の部署ID集合を返す。外側はその集合にIN(含まれる)する部署IDを持つ社員の名前を返すので、東京の部署に属する社員の名前が得られ正しい。
?選択肢ごとの解説
ア ×東京以外の部署に属する社員はNOT INを使った場合の結果であり、INは集合に含まれる側を返すため逆である。
イ ○内側の副問合せは所在地が東京の部署の部署ID集合を返す。外側はその集合にIN(含まれる)する部署IDを持つ社員の名前を返すので、東京の部署に属する社員の名前が得られ正しい。
ウ ×全社員を返すのはWHERE条件を無視した場合であり、IN句で部署IDが東京の集合に絞られるため誤りである。
エ ×所在地名を返すのは内側の副問合せだけを単独実行した場合に近く、外側のSELECTは社員の名前を返すため誤りである。
✎くわしく
非相関副問合せはまず内側が独立に評価され、その結果集合を外側のIN句が利用する。IN は『集合に含まれるか』を判定する述語で、NOT IN は補集合を返す。内側で何の集合(部署ID)を作り、外側で何(社員名)を返すかを分けて読むことが要点である。
✓本番での押さえどころ
試験のコツ
副問合せは『内側=どんな集合を作るか』『外側=その集合をどう使い何を返すか』に分解して読む。IN は包含、NOT IN は除外。
覚え方
IN は『その仲間に入っているか』。東京チームの部署IDリストに入っている社員を拾う、と読み替える。
よくある誤り
IN と NOT IN を取り違える、または内側の副問合せが返す列(部署ID)と外側が返す列(名前)を混同する誤りが多い。
データベースの他の問題
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-a3-0245