DBデータベーススペシャリスト試験 午前Ⅱ

平成22年度春期 データベーススペシャリスト 午前Ⅱ 問14

問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。

問題

“製品”表と“在庫”表に対し,次のSQL文を実行した結果として得られる表の行数は幾つか。
SQL文。SQL文:SELECT DISTINCT 製品番号 FROM 製品 WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫 WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号)。在庫数が30を超える在庫行が存在しない製品の製品番号を抽出する。
SQL文。SQL文:SELECT DISTINCT 製品番号 FROM 製品 WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫 WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号)。在庫数が30を超える在庫行が存在しない製品の製品番号を抽出する。
表。製品表(製品番号,製品名,単価):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。
表。製品表(製品番号,製品名,単価):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. ア
    1
  2. イ
    2
  3. ウ
    3
  4. エ
    4
解き方のヒントを見る

複数表の問合せで行数を追う視点

複数の表を扱う問合せでは、最終結果だけを直感で見積もるより、処理の段階ごとに対象となる行の集まりがどう変わるかを順に書き出して確かめることが大切です。途中の行数を記録しながら進めましょう。

この問題で問われていること

問われているのは最終的に得られる行の数です。各表にどんな値の行がいくつあるかを把握したうえで、問合せの各指定が適用されるたびに対象の行の集まりがどう変化するかを、省略せずに追跡できるかが試されます。

視点

問合せの結果は、各表の行をもとに、指定が一段ずつ適用されて作られると考えられます。行数を求めるときは、一度に結論を出そうとせず、段階ごとに『いま手元にある行の集まり』を小さな表として書き出すと、見落としや数え違いを減らせます。各段階で行が増えるのか、減るのか、まとめられるのかを、自分の手で確かめることが大切です。

確認ポイント

  • 各表について、関係する列にどの値の行がいくつあるかを書き出して把握したか
  • 問合せの指定を一つ適用するごとに、その時点の行の集まりを書き出して行数を記録したか
  • 最後に、得られた行数が途中で記録した各段階の行数とつじつまが合っているかを見直したか
正解と解説を見る

正解

イ

解説

在庫数が30を超える在庫行を一つも持たない製品を数えると、在庫表にないMZ1000と、在庫数が30と20だけのXZ3000の2製品が残るため、結果は2行でイが正解になるよ。

理由

副問合せは、製品表の各行と同じ製品番号を持ち、在庫数が30を超える在庫行を探すよ。在庫数が30を超える行は、WH100のCC5001(200)とZZ9900(130)、WH101のAB1805(150)、WH103のCC5001(40)の4行だから、該当する製品はAB1805、CC5001、ZZ9900の3種類になるよ。これらはEXISTSが真、つまりNOT EXISTSが偽になるので除外されるよ。残るのはMZ1000とXZ3000の2製品なので、結果は2行になるよ。

比較

MZ1000は在庫表に1行もないので副問合せの結果が0行になり、NOT EXISTSが真で残るよ。XZ3000はWH101に30、WH102に20あるけれど、「在庫数 > 30」は30を含まないので該当する行がなく、NOT EXISTSが真で残るよ。一方、AB1805(WH100で20)やZZ9900(WH102で10)のように30以下の行があっても、別の倉庫に30を超える行が1行でもあれば除外されるよ。製品表の製品番号は各行で異なるので、DISTINCTを付けても行数は変わらないよ。

選択肢ア

これは不正解だよ。結果は1行ではなく2行になるよ。在庫表に一度も現れないMZ1000は副問合せの結果が0行になってNOT EXISTSが真となり、残るよ。さらにXZ3000も在庫数が30と20だけで、「在庫数 > 30」は30を含まないから該当する行がなく、同じように残るよ。1行とするとどちらかが抜けていて、公式の条件と合わないよ。

選択肢イ(正解)

これは正解だよ。在庫数が30を超える在庫行を持つAB1805(150)、CC5001(200と40)、ZZ9900(130)は、NOT EXISTSが偽になって除外されるよ。在庫表にないMZ1000と、在庫数が30と20だけで30超の行がないXZ3000は、NOT EXISTSが真になって残るよ。製品番号は重複しないので、結果は2行になるよ。

選択肢ウ

これは不正解だよ。結果は3行ではなく2行になるよ。在庫数が30を超える行を持つ製品はAB1805、CC5001、ZZ9900の3種類で、これらはNOT EXISTSによって除外される側だよ。3という数は除外される製品の数と同じだけれど、この問題で求められているのは除外されずに残る製品の行数で、それはMZ1000とXZ3000の2行だよ。

選択肢エ

これは不正解だよ。4行にはならないよ。AB1805はWH100では20だけれどWH101に150があり、ZZ9900もWH102では10だけれどWH100に130があるよ。どちらも30を超える行が1行以上あるのでEXISTSが真になって除外されるし、CC5001も同じく除外されるよ。30以下の行があるだけでは残らないから、結果は2行だよ。

学習のポイント

相関副問合せを使ったNOT EXISTSの評価方法と、「>」が境界値を含まないことの確認

出典:独立行政法人 情報処理推進機構(IPA)平成22年度春期 データベーススペシャリスト試験 午前Ⅱ 問14(公式資料:問題冊子(PDF) / 解答例)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針