資格取得

【解説】応用情報 平成24年度 春期 午後データベース過去問

今回は、応用情報技術者試験、平成24年度春期午後のデータベースの問題について解説していきます。実際の問題は以下のリンクからダウンロードください。
» 応用情報技術者 平成24年度春期午後 過去問

それではさっそく解説にまいりましょう。

もくじ

平成23年度秋期午後問題 データベース 解説

設問1

難易度:★★☆☆☆

設問1のSQL文としては、通常より難易度が高めの問題ですね。
CREAT VIEWが使われていますが、基本的には通常通りのSQL文と変わらないと考えてOKです。

着眼点

問題の解答に入る前に、この問題の着眼点について見てみましょう。この問題の着眼点は以下です。

両システムのテーブルを統合する際、既存のテーブル定義とデータを保持したまま、一つのスキーマ上に各テーブルを実装することにした。
A市図書館とB市図書館それぞれで結合したテーブルを作成し、最終的にそれら2つのテーブルを結合させて1つのテーブルにする

このように、別々に作成したテーブルを合わせて新しい表を作る場合には、UNIONまたはUNION ALLを使います。両テーブルを横からつなげるのではなく、単純にレコードを追加する(縦につなげる)イメージです。

UNIONは重複行の排除するとき、UNION ALLは重複行を排除をせずすべての行を出力するときに使います。いわゆる「和」というやつです。

A市図書館の結合結果
UNION
B市図書館の結合結果

のような構造のSQLを作ればOKです。

それでは、これを踏まえて解答を考えていきます。

解答までの筋道-図1について-

まずは、図1について考えていきます。

SQL文を解くときは、以下の手順で考えるようにしましょう。

  • いきなりSQL文を見ない(重要)
  • 結合するテーブルを考える
  • テーブルの結合条件、絞り込み条件、グルーピング条件、グループ絞り込み条件、並び替え条件の順に条件を考える

上記を踏まえて、この設問を解くときに着目する問題文は以下になります。

  • テーブル結合のヒント:(SQL文より)SELECT文で書籍名、著者名、出版社名、ISBN、図書館名COUNT(書籍〇.書籍番号)が使われている。
  • 絞り込みのヒント:(問題文より)両システムとも貸出記録テーブルの"返却日"の値は、貸出中はNULLを、返却後は返却した日付を設定した。

SQL文を見ない、と言っているのにいきなりSQL文を見ていますね笑 SQL文を見ないという意図は「SQL文を読んでそれを基に空欄を考えるのではなく、だいたいこんな方法でSQL文を作っていけばいいかな、という予想してからSQL文を見て空欄を埋めていきましょう」ということです。
どのテーブルを結合すればよいか、というヒントを得るためにSQL文を見るのはOKです。というか、それができないと見当がつきにくいです笑

さて問題文に戻りまして、テーブル結合のヒントのカラムをSELECTするためには、表1、2から、A市図書館とB市図書館それぞれで蔵書テーブルと書籍テーブルを書籍番号で結合する必要がありそうです。結合方法としては、WHERE句での等結合やINNER JOINなどが考えられます。

ここでSQL文を見てみると、WHERE句のa、d空欄になっていて、テーブルの結合条件がまだ記載されていません。このことから、a、dはテーブルを結合する等結合のSQLが入ると判断できます。したがって、

a:蔵書A.書籍番号=書籍A.書籍番号
d:蔵書B.書籍番号=書籍B.書籍番号

となります。

次に、蔵書テーブルと書籍テーブルを結合した表から、抽出したいデータを絞り込みます。

絞り込みのヒントから、返却日のカラムがNULLになっているレコードを抽出すればよいですね。方法は色々ありますが、SQL文を見てみると、WHERE句でNOT INを使っているようです。いわゆる副問合せです。

副問合せのSQL文を読むと、NULLになっている蔵書番号(貸出中の蔵書番号)を抽出しているので、それらの蔵書番号と一致しない蔵書番号を先ほど結合したテーブル上で残す(貸出可能な蔵書番号を残す)、という方法を取っていると予想できます。

副問合せの中は貸出記録がNULLになっているレコードを抽出すればよいので、

b:貸出記録A.返却日 IS NULL
e:貸出記録B.返却日 IS NULL

となります。

NULLを検索する場合は、"="を使わないないことに注意しましょう。

さて、これでA市図書館とB市図書館の貸出可能な蔵書の表は出来上がったのでこれらの和を取ればよいので、

c:UNION (別解:UNION ALL)
となります。

この問題の場合は、各図書館で蔵書番号は1冊ごとに異なり、SQL文からレコードにA市図書館、B市図書館というデータが追加されるので、UNIONした後のレコードは基本的に重複はありません。そのため、UNIONでもUNION ALLでも結果は変わらないので、どちらでもかまいません。

解答までの筋道-図2について-

次に図2のSQL文について考えていきます。

この問題を解く上でのヒントは以下になります。

  • "統合貸出予約"ビューは、"貸出状況"の値が"貸出可"となっている蔵書の一覧を表示する

図1が完成していれば簡単ですね。蔵書A、Bのテーブルに貸出状況というカラムが追加されているので、この追加カラムで"貸出可"となっているレコードをWHERE句で絞り込めばOKです。したがって、

f:蔵書A.貸出状況 = '貸出可'
g:蔵書B.貸出状況 = '貸出可'

となります。

細かいですが、文字列を比較条件に使うときは「シングルクォーテーション」が必要なことに注意しましょう。

設問2

難易度:★★★☆☆

少し思考力が問われる問題ですが、過去問を解けば分かる問題かなと思います。

解答までの筋道

ポイントは、夜間バッチ処理で情報をコピーしてビューを作成する、という点です。応用情報の問題では、バッチ処理は問われる可能性の高いキーワードです。

バッチ処理を行う場合、バッチ処理までの間に発生した最新データはデータベースに反映されないという問題点があります。例えば、ネットショッピングサイトで購入可能な商品を実際に購入してみると欠品でした、みたいなこともあり得るわけです(必ずしもバッチ処理の問題ではなく、在庫入力担当者のミスということもありますが)。

そんなことを頭に入れながら設問を考えてみると、夜間バッチ処理後に貸出状況が変わったデータは、次の夜間バッチ処理まで統合検索サービス(ビュー)では参照できないことになりますね。このことを考慮して、

設問2:夜間バッチ処理後に貸出状況が変わることがあるから
などと解答すればよいでしょう。

今回のように、バッチ処理の間に発生したデータをどう取り扱うかは、応用情報でよく問われることはもちろん、実際のシステム構築でも"あるある"な重要ポイントなので、解答できるようにしておきましょう。

設問3

難易度:★★☆☆☆

頻出の完全な知識問題です。知識問題は確実に得点できるようにしましょう。

解答までの筋道

更新不可能なビューは以下の2パターンです。

更新不可能なビュー

  • SELECT句で、式・集合関数・DISTINCTを使用している
  • GROUP BY、HAVINGを含んでいる

ビューというのは単に見せるための表なので、元々のテーブルとは別物です。ただ、このビューを更新する場合、元々のテーブルを更新する必要があります。

この時、元テーブルのどの情報を更新するかがコンピュータ側で判断できる必要がありますが、ビューの情報粒度が粗い(いくつかの情報をまとめて表示するビュー)場合、元のデータを特定することができません。こういった場合が更新不可能なビューになります。言い換えると、更新される表のカラムやレコードが唯一に特定できる場合に限って更新可能ということになります。

そのため、複数のデータをまとめて表示してしまっている(元データが特定できない)集合関数、DISTINCT、GROUP BYなどは更新不可能となります。

上記を基に考えると、図1のSQL文は集合関数であるCOUNTを含んでいるので、

設問3:イ

となります。

設問4

難易度:★★☆☆☆

設問4にしては非常に易しい問題です。確実に解答しましょう。

解答までの筋道

この問題を解く上でのヒントは以下になります。

  1. 表1 注記:同じ本が複数冊ある場合、"書籍番号"は同じだが"蔵書番号"は異なる
  2. 表2 注記:同じ本が複数冊ある場合、"ISBN"は同じだが"蔵書番号"は異なる
  3. 両システムの蔵書テーブル中の"蔵書番号"には、共に10桁の数字が使われており、"蔵書A"テーブルと"蔵書B"テーブルで重複があった
  4. SQL文中で'A市図書館'、'B市図書館'のデータが入力されていること

上記のヒント1、2、3から、各々の図書館では重複する蔵書番号はないが、両図書館を合わせると重複することが分かります。逆に言えば、どちらの図書館か分かれば重複するレコードはなくなります。ヒント4から、各レコードに"図書館名"として"A市図書館"か"B市図書館"と入力されるので、これで重複がなくなります。

よって、

設問4:蔵書番号、図書館名
となります。

さいごに

今回は、応用情報技術者試験、平成24年度春期午後のデータベースの問題について解説しました。

SQLの問題も文章を記述する問題も、そこまで難しい問題ではないと思いますので、今回の問題は確実にクリアできるようにしておきましょう。

ぜひ、応用情報技術者試験の勉強にお役立てお役立ていただければと思います。

それでは!

-資格取得