平成26年度 春期 午前 問28
データベース
SQL文
“商品”表,“在庫”表に対する次の SQL 文の結果と同じ結果が得られる SQL 文はどれか。ここで,下線部は主キーを表す。
SELECT 商品番号 FROM 商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 在庫)
〔表の定義〕字に書き起こしたもの(下線部=主キーを 太字 で表す)
商品(商品番号,商品名,単価) 在庫(倉庫番号,商品番号,在庫数)
- アSELECT 商品番号 FROM 在庫 WHERE EXISTS (SELECT 商品番号 FROM 商品)
- イSELECT 商品番号 FROM 在庫 WHERE NOT EXISTS (SELECT 商品番号 FROM 商品)
- ウSELECT 商品番号 FROM 商品 WHERE EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号 = 在庫.商品番号)
- エSELECT 商品番号 FROM 商品 WHERE NOT EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号 = 在庫.商品番号)
答えと解説を見る
✓ これが正解エSELECT 商品番号 FROM 商品 WHERE NOT EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号 = 在庫.商品番号)
解説
在庫が無い商品を返す文は、行ごとに存在を調べます。
書き換えの問いでは、元の文が何を返すのかを先に日本語の一文にしておくと迷いません。元の文は商品の表から商品番号を取り出し、そのうち在庫の表に現れないものだけを残しています。つまり在庫が一件もない商品の商品番号です。同じことを存在の有無で書き直すと、商品の一行ごとに、その商品番号を持つ在庫の行があるかどうかを調べ、無ければその行を残す、という形になります。ここで欠かせないのが、内側の問合せの中に、外側の表の列と内側の表の列を突き合わせる条件を置くことです。この条件があって初めて、判定が行ごとに行われます。取り出す先が商品の表であること、内側に突き合わせの条件があること、存在しないほうを残していること、この三つを満たす文が正解です。
ほかの選択肢はなぜ違うのか
- アSELECT 商品番号 FROM 在庫 …:取り出す先が在庫の表になっており、元の文が商品の表から取り出しているのと合いません。内側にも突き合わせの条件が置かれていないため、判定が行ごとにならず全体で一度きりになります。
- イSELECT 商品番号 FROM 在庫 …:こちらも取り出す先が在庫の表で、元の文とは結果に並ぶ行の集合そのものが違います。内側の問合せが外側の行と結び付いていないので、否定を付けても行ごとの判定にはなりません。
- ウSELECT 商品番号 FROM 商品 …:取り出す先は商品の表で、内側には突き合わせの条件も置かれています。しかし存在するほうを残しているため、在庫がある商品の側を返してしまい、元の文とちょうど正反対の結果になります。
出典:平成26年度 春期 基本情報技術者試験 午前 問28(改変:原典の図表をテキストに書き起こした)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)