令和5年度 秋期 午前 問29
データベース
NOT EXISTSに関する問題
“製品”表と“在庫”表に対し,次の SQL 文を実行した結果として得られる表の行数は幾つか。
〔SQL 文〕
SELECT DISTINCT 製品番号 FROM 製品
WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫
WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号)
〔製品〕
製品番号 | 製品名 | 単価 AB1805 | CD-ROM ドライブ | 15,000 CC5001 | デジタルカメラ | 65,000 MZ1000 | プリンタ A | 54,000 XZ3000 | プリンタ B | 78,000 ZZ9900 | イメージスキャナ | 98,000
〔在庫〕
倉庫コード | 製品番号 | 在庫数 WH100 | AB1805 | 20 WH100 | CC5001 | 200 WH100 | ZZ9900 | 130 WH101 | AB1805 | 150 WH101 | XZ3000 | 30 WH102 | XZ3000 | 20 WH102 | ZZ9900 | 10 WH103 | CC5001 | 40
- ア1
- イ2
- ウ3
- エ4
答えと解説を見る
✓ これが正解イ2
解説
在庫が 30 を超えない製品は 2 件です。
設問は、製品表と在庫表に対して副問合せを含む SQL 文を実行したときの、結果の行数を問うています。NOT EXISTS は、内側の問合せが 1 行も返さないときに成り立ちます。内側には製品表と在庫表の製品番号を突き合わせる条件が入っているので、外側の製品 1 行ごとに、その製品について在庫数が 30 を超える行があるかどうかを確かめる形になります。ですから読み方は引き算です。まず在庫表から在庫数が 30 を超える行を拾うと 4 行あり、その製品番号は重複をまとめると 3 種類になります。製品表は 5 件なので、そこから 3 種類を除いた 2 件が残ります。正解は 2 です。ここで在庫数がちょうど 30 の行は、30 を超えるという条件に当てはまらない点に注意が必要です。なお製品番号は製品表の主キーなので、DISTINCT が付いていても行数は変わりません。
ほかの選択肢はなぜ違うのか
- ア1:在庫表に行がある製品をすべて除くと、残りは 1 件になります。しかし条件は在庫があることではなく、在庫数が 30 を超える行があることなので、20 と 30 しか持たない製品は除かれずに残ります。
- ウ3:5 件から 2 種類だけを除くとこの値になります。在庫数が 30 を超える行は 4 行あり、そのうち 2 行が同じ製品番号なので、重複をまとめても 2 種類ではなく 3 種類が残ります。
- エ4:5 件から 1 種類だけを除くとこの値になります。200 という目立つ在庫数の行だけを拾い、150 や 130 や 40 の行を数え落とすと、除く側が CC5001 の 1 種類だけになってこうなります。なお 150 と 200 の 2 行だけを拾った場合は AB1805 と CC5001 の 2 種類が除かれ、残りは 3 件になります。
出典:令和5年度 秋期 応用情報技術者試験 午前 問29
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)