応用情報技術者 2023年 秋期 午前2 問29
問題文
“製品” 表と “在庫” 表に対し、次の SQL文を実行した結果として得られる表の行数は幾つか。
SELECT DISTINCT 製品番号 FROM 製品
WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫
WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号)

選択肢
ア:1
イ:2(正解)
ウ:3
エ:4
製品表と在庫表のSQL文の結果行数【午前2 解説】
要点まとめ
- 結論:SQL文は「在庫数が30を超える在庫が存在しない製品番号」を抽出し、結果は2行となる。
- 根拠:NOT EXISTS句は「在庫数 > 30かつ製品番号が一致する行が存在しない」製品を選ぶため、条件に合う製品を表から探す。
- 差がつくポイント:在庫表の複数倉庫の在庫数を個別に評価し、どこかに30超の在庫があれば除外される点を正確に理解すること。
正解の理由
このSQLは「製品表の製品番号のうち、在庫表において在庫数が30を超えるものが存在しない製品番号」を抽出します。
在庫表を確認すると、在庫数が30を超える製品は「CC5001(200, 40)」「ZZ9900(130)」と「AB1805(150)」です。
「XZ3000」は30以下の在庫数(30と20)なので条件に合致しません。
よって、在庫数が30を超える在庫が存在しない製品は「MZ1000」と「XZ3000」の2つであり、結果は2行です。
したがって、正解はイです。
在庫表を確認すると、在庫数が30を超える製品は「CC5001(200, 40)」「ZZ9900(130)」と「AB1805(150)」です。
「XZ3000」は30以下の在庫数(30と20)なので条件に合致しません。
よって、在庫数が30を超える在庫が存在しない製品は「MZ1000」と「XZ3000」の2つであり、結果は2行です。
したがって、正解はイです。
よくある誤解
在庫数の合計を考えてしまいがちですが、SQL文は個々の在庫行で条件を判定します。
また、在庫数がちょうど30のものは条件に含まれず、30を超えるかどうかがポイントです。
また、在庫数がちょうど30のものは条件に含まれず、30を超えるかどうかがポイントです。
解法ステップ
- 製品表の全製品番号をリストアップする。
- 在庫表から「在庫数 > 30」かつ「製品番号が一致する」行を探す。
- そのような行が存在しない製品番号を抽出する。
- 抽出された製品番号の数を数える。
選択肢別の誤答解説
- ア(1):在庫数が30を超える製品が複数あるため1行は少なすぎる。
- イ(2):正解。条件に合致する製品番号は2つ。
- ウ(3):在庫数が30を超える製品を除外すると3つは多すぎる。
- エ(4):製品表の全製品数は5だが、条件に合うのは2つだけなので誤り。
補足コラム
SQLのNOT EXISTS句はサブクエリの結果が空の場合に真となるため、存在しない条件を表現するのに便利です。
また、DISTINCTは重複排除のため、同じ製品番号が複数行あっても1行としてカウントされます。
また、DISTINCTは重複排除のため、同じ製品番号が複数行あっても1行としてカウントされます。
FAQ
Q: 在庫数が30の製品は抽出されますか?
A: いいえ、条件は「在庫数 > 30」なので30は含まれません。
A: いいえ、条件は「在庫数 > 30」なので30は含まれません。
Q: 複数倉庫の在庫数を合計して判定しますか?
A: いいえ、SQL文は個々の在庫行で判定し、合計は考慮しません。
A: いいえ、SQL文は個々の在庫行で判定し、合計は考慮しません。
関連キーワード: SQL, NOT EXISTS, DISTINCT, サブクエリ、在庫管理、条件検索

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

