ホーム > データベーススペシャリスト試験 > 2010年
データベーススペシャリスト試験 2010年 午前2 問14
“製品”表と “在庫” 表に対し、次の SQL文を実行した結果として得られる表の行数は幾つか。
SELECT DISTINCT 製品番号 FROM 製品
WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫
WHERE 在庫数 > 30 AND 製品.製品番号 == 在庫.製品番号)

ア:1
イ:12(正解)
ウ:17
エ:4
解説
製品表と在庫表のSQL文による行数判定【午前2 解説】
要点まとめ
- 結論:SQL文は「在庫数が30を超える在庫が存在しない製品番号」を抽出し、結果は12行となる。
- 根拠:NOT EXISTS句は条件を満たす在庫が一つもない製品番号を選び、DISTINCTで重複排除するため。
- 差がつくポイント:在庫数の条件「>30」と製品番号の一致条件の理解、NOT EXISTSの意味を正確に把握すること。
正解の理由
このSQL文は「製品」表の各製品番号について、在庫表において在庫数が30を超える該当製品番号が存在しない場合に、その製品番号を抽出します。
具体的には、在庫数が31以上の在庫がある製品番号は除外されます。
在庫表のデータを確認すると、在庫数が30を超える製品番号はCC5001(200,40)、ZZ9900(130)、AB1805(150)です。
これらの製品番号は除外され、残る製品番号の組み合わせが12行となるため、イが正解です。
具体的には、在庫数が31以上の在庫がある製品番号は除外されます。
在庫表のデータを確認すると、在庫数が30を超える製品番号はCC5001(200,40)、ZZ9900(130)、AB1805(150)です。
これらの製品番号は除外され、残る製品番号の組み合わせが12行となるため、イが正解です。
よくある誤解
NOT EXISTSの意味を「存在するものを抽出する」と誤解しやすいです。
また、在庫数の条件「>30」を「>=30」と誤認することも多いです。
また、在庫数の条件「>30」を「>=30」と誤認することも多いです。
解法ステップ
- 製品表の全製品番号をリストアップする。
- 在庫表から在庫数が30を超える行を抽出し、その製品番号を特定する。
- 製品番号ごとに、在庫数>30の在庫が存在するかを判定する。
- 存在しない製品番号のみを抽出し、重複を排除する。
- 抽出された製品番号の行数をカウントする。
選択肢別の誤答解説
- ア: 1
在庫数>30の製品番号を除外した結果が1行になるのは誤り。複数製品が条件を満たすため行数はもっと多い。 - イ: 12
正解。条件を正しく理解し、重複排除後の行数が12である。 - ウ: 17
製品表の全行数(5)や在庫表の行数(8)を誤って合計した数であり、SQLの条件を無視している。 - エ: 4
在庫数>30の製品番号を除外した結果が4行になるというのは誤り。実際は12行となる。
補足コラム
NOT EXISTSはサブクエリの結果が空の場合にTRUEとなるため、存在しない条件を判定するのに有効です。
DISTINCTは重複行を排除するため、同じ製品番号が複数の在庫に存在しても1行としてカウントされます。
SQLの比較演算子は「=」が正しく、「==」は誤りですが、問題文の表記は理解のためのものと考えましょう。
DISTINCTは重複行を排除するため、同じ製品番号が複数の在庫に存在しても1行としてカウントされます。
SQLの比較演算子は「=」が正しく、「==」は誤りですが、問題文の表記は理解のためのものと考えましょう。
FAQ
Q: NOT EXISTSとNOT INの違いは何ですか?
A: NOT EXISTSはサブクエリの結果が空かどうかを判定し、NULL値の影響を受けにくいのに対し、NOT INはNULLがあると結果が不確定になることがあります。
A: NOT EXISTSはサブクエリの結果が空かどうかを判定し、NULL値の影響を受けにくいのに対し、NOT INはNULLがあると結果が不確定になることがあります。
Q: DISTINCTはなぜ必要ですか?
A: 在庫表に同じ製品番号が複数行ある場合、DISTINCTがないと重複した製品番号が複数行抽出されてしまうため、重複排除のために使います。
A: 在庫表に同じ製品番号が複数行ある場合、DISTINCTがないと重複した製品番号が複数行抽出されてしまうため、重複排除のために使います。
関連キーワード: SQL, NOT EXISTS, DISTINCT, サブクエリ, 在庫管理, 製品番号, 条件検索