データベーススペシャリスト試験 2010年 午前214


“製品”表と “在庫” 表に対し、次の 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行となるため、が正解です。

よくある誤解

NOT EXISTSの意味を「存在するものを抽出する」と誤解しやすいです。
また、在庫数の条件「>30」を「>=30」と誤認することも多いです。

解法ステップ

  1. 製品表の全製品番号をリストアップする。
  2. 在庫表から在庫数が30を超える行を抽出し、その製品番号を特定する。
  3. 製品番号ごとに、在庫数>30の在庫が存在するかを判定する。
  4. 存在しない製品番号のみを抽出し、重複を排除する。
  5. 抽出された製品番号の行数をカウントする。

選択肢別の誤答解説

  • ア: 1
    在庫数>30の製品番号を除外した結果が1行になるのは誤り。複数製品が条件を満たすため行数はもっと多い。
  • イ: 12
    正解。条件を正しく理解し、重複排除後の行数が12である。
  • ウ: 17
    製品表の全行数(5)や在庫表の行数(8)を誤って合計した数であり、SQLの条件を無視している。
  • エ: 4
    在庫数>30の製品番号を除外した結果が4行になるというのは誤り。実際は12行となる。

補足コラム

NOT EXISTSはサブクエリの結果が空の場合にTRUEとなるため、存在しない条件を判定するのに有効です。
DISTINCTは重複行を排除するため、同じ製品番号が複数の在庫に存在しても1行としてカウントされます。
SQLの比較演算子は「=」が正しく、「==」は誤りですが、問題文の表記は理解のためのものと考えましょう。

FAQ

Q: NOT EXISTSとNOT INの違いは何ですか?
A: NOT EXISTSはサブクエリの結果が空かどうかを判定し、NULL値の影響を受けにくいのに対し、NOT INはNULLがあると結果が不確定になることがあります。
Q: DISTINCTはなぜ必要ですか?
A: 在庫表に同じ製品番号が複数行ある場合、DISTINCTがないと重複した製品番号が複数行抽出されてしまうため、重複排除のために使います。

関連キーワード: SQL, NOT EXISTS, DISTINCT, サブクエリ, 在庫管理, 製品番号, 条件検索
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ