DBデータベーススペシャリスト試験 午後Ⅰ

令和3年度秋期 データベーススペシャリスト 午後Ⅰ 問3

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問3 テーブルの移行及びSQLの設計に関する次の記述を読んで,設問1,2に答えよ。 A社は,不動産賃貸仲介業を全国規模で行っている。RDBMSを用いて物件情報検索システム(以下,検索システムという)を運用している運用部門のKさんは,物件情報を検索するSQL文を設計している。 〔検索システムの概要〕 検索システムは,物件を管理するシステムを補完するシステムであり,社内利用者が接客するとき,当該システムの“物件”テーブルを利用している。 1.社内利用者の接客業務の概要 (1)物件を探している借主に対して,当該借主の希望に近い物件を探す支援を行い,借主と貸主との間の交渉・賃貸契約の仲介を行う。 (2)物件の貸主に対して,物件の審査を行う。当該貸主に長期の空き物件がある場合,周辺の競合物件の付帯設備(以下,設備という)の設置状況を調査し,当該空き物件に人気の設備を増強することなど,物件の付加価値を高める対策の助言を行うこともある。 2.“物件”テーブル (1)A社が仲介する全ての物件を,物件コードで一意に識別する。 (2)物件の沿線,最寄駅,賃料,間取りなどの基本属性を記録する列がある。 (3)エアコン,オートロックなどの設備が設置されているかどうかの有無を記録する列があり,一つの物件に最大20個の設備の有無を記録できる。 (4)記録されている20個の設備について,どの設備もいずれかの物件に設置されているが,20個全ての設備が設置されている物件は限られている。 (5)設備に流行があるので,テーブルの定義を変更し,記録する人気の設備を毎年入れ替える処理を行っている。この処理を物件設備の入替処理と呼んでいる。 (6)“物件”テーブルの全ての列にNOT NULL制約を指定している。 3.“物件”テーブルのテーブル構造,主な列の意味と制約及び主な統計情報 “物件”テーブルのテーブル構造を図1に,主な列の意味・制約を表1に,RDBMSの機能を用いて取得した主な統計情報を表2に示す。 図1 “物件”テーブルのテーブル構造(一部省略) 表1 “物件”テーブルの主な列の意味・制約(一部省略) 表2 “物件”テーブルの主な統計情報 4.検索システムの課題 Kさんは,社内利用者に聞取り調査を行い,その結果を二つの課題にまとめた。 (1)“物件”テーブルの各設備の有無を示す列(以下,総称して設備列という)の数は不十分で,借主からの問合せに十分に対応できていない。追加したい設備は,テレワーク対応,宅配ボックス,追い焚き風呂などがあり,現在の20個を含め,全​​部で100個ある。将来,増える可能性がある。 (2)設備の設置済個数が分からない。例えば,借主から物件に設置されているエアコンについて問合せがあったとき,設置されている正確な個数が分からず,別の詳細な物件設備台帳を調べなければならない。 〔物件の設備に関する調査及び課題への対応〕 1.物件の設備に関する調査 Kさんは,現在検索できる設備の組合せを述語に指定したSQL文を調査した。そのSQL文の例を,表3に示す。そしてKさんは,SQL文の結果行を保存するファイルの所要量を見積もる目的で,表3の各SQL文の結果行数を見積もった。 表3 設備の組合せを述語に指定したSQL文の例(未完成) 注記 FLOOR関数は,引数以下の最大の整数を計算する。 2.物件の設備に関する課題への対応 Kさんは,物件の設備に関する課題に対応するため,次の2案について長所及び短所を比較した結果,案Bを採用することにした。 案A “物件”テーブルにエアコン台数列を追加する。 案B 追加・変更するテーブルのテーブル構造を,図2に示すとおりにする。 ・“設備”テーブルを追加する。 ・図1に示した“物件”テーブルを“新物件”テーブルに置き換える。 ・“物件設備”テーブルを追加する。 図2 追加・変更するテーブルのテーブル構造 設備コードは,全設備を一意に識別するコードで,そのうち20個は,“物件”テーブルの各設備列に対応させた。また,“設備”テーブルの設備名の列値に“物件”テーブルの設備列名をそのまま設定し,今後追加される設備名を含めて重複させないことに決めた。 3.テーブルの移行 Kさんは,追加・変更するテーブルへの移行を,次のような手順で行った。 (1)“設備”,“新物件”及び“物件設備”テーブルを定義した。 (2)“物件”テーブルから設備列20個を除いた全行を,“新物件”テーブルに複写した。 (3)“設備”テーブルに100個の設備を登録した。エアコン又はオートロックを登録するSQL文の例を,表4のSQL4に示す。 (4)“物件設備”テーブルには“物件”テーブルにある設備に限って行を登録した。エアコン又はオートロックがある行を登録するSQL文の例を,表4のSQL5に示す。ここで,設置済個数列に1を設定し,正確な個数を移行後に設定することにした。 (5)テーブルの統計情報を取得した。主な統計情報を表5に示す。 表4 “設備”テーブル又は“物件設備”テーブルに登録するSQL文の例(未完成) 表5 追加・変更したテーブルの主な統計情報(未完成) 注記 網掛け部分は表示していない。 〔テーブルの移行の検証〕 Kさんは,テーブルの移行を次のように検証し,新たなビューを定義した。 1.SQL文の検証 テーブルの移行の前後でSQL文が同じ結果行を得るか検証するため,移行前のSQL文(表3のSQL1,SQL2)に対応する移行後のSQL文を,それぞれ表6のSQL6,SQL7のとおりに設計した。そして,“1.物件の設備に関する調査”で保存したファイルを用いて,SQL1とSQL6の結果行,SQL2とSQL7の結果行がそれぞれ一致することを確認した。 表6 移行後のSQL文の例(未完成) 2.ビューの定義 Kさんは,“物件”テーブルの定義を削除した後でも実績のあるSQL文を変更することなく使いたいと考えている。そのために“物件”テーブルにあった沿線列,かつ,エアコン列とオートロック列の両方を表示するビュー“物件”を,図3のとおりに定義した。 図3 ビュー“物件”の定義(未完成) 設問1 〔物件の設備に関する調査及び課題への対応〕について,(1)~(4)に答えよ。 (1)表3中の【イ】,【ロ】に入れる適切な数値を,【ハ】~【ホ】に入れる適切な字句を答えよ。ここで,沿線,エアコン,オートロックの列値の分布は互いに独立し,各列の列値は一様分布に従うと仮定すること。 (2)“2.物件の設備に関する課題への対応”について,Kさんが採用した案Bの長所を一つ,本文中の用語を用いて,25字以内で具体的に述べよ。 (3)表4中の【a】,【c】及び【d】に入れる適切な字句を,【b】,【e】に入れる一つの適切な述語を答えよ。 (4)表5中の【あ】,【い】に入れる適切な数値を答えよ。 設問2 〔テーブルの移行の検証〕について,(1)~(3)に答えよ。 (1)表6中の【f】~【j】に入れる適切な字句を答えよ。 (2)表6中のSQL7の選択リストにあるDISTINCTの目的は,結果行の重複を排除するためである。このSQL7で行が重複するのはどのような場合か。本文中の用語を用いて,30字以内で具体的に述べよ。 (3)図3中の【k】~【o】に入れる適切な字句を答えよ。
図1 “物件”テーブルのテーブル構造(一部省略)。物件テーブルの列構成を示す図で,物件コード,物件名,沿線,最寄駅,賃料,間取り,設備列などを列挙している。
図1 “物件”テーブルのテーブル構造(一部省略)。物件テーブルの列構成を示す図で,物件コード,物件名,沿線,最寄駅,賃料,間取り,設備列などを列挙している。
表1 “物件”テーブルの主な列の意味・制約(一部省略)。物件テーブルの主な列名と,各列の意味や設備の有無を示す値Y・Nなどの制約を整理した表。
表1 “物件”テーブルの主な列の意味・制約(一部省略)。物件テーブルの主な列名と,各列の意味や設備の有無を示す値Y・Nなどの制約を整理した表。
表2 “物件”テーブルの主な統計情報。物件テーブルの行数,列名,列値個数を示す統計情報の表。物件コードの個数は160万,沿線は400である。
表2 “物件”テーブルの主な統計情報。物件テーブルの行数,列名,列値個数を示す統計情報の表。物件コードの個数は160万,沿線は400である。
表3 設備の組合せを述語に指定したSQL文の例(未完成)。設備条件を指定するSQL1からSQL3の目的,SQL構文,見積結果行数を示す未完成の表。
表3 設備の組合せを述語に指定したSQL文の例(未完成)。設備条件を指定するSQL1からSQL3の目的,SQL構文,見積結果行数を示す未完成の表。
図2 追加・変更するテーブルのテーブル構造。設備,新物件,物件設備の三つのテーブルと,それぞれの列構成を示している。
図2 追加・変更するテーブルのテーブル構造。設備,新物件,物件設備の三つのテーブルと,それぞれの列構成を示している。
表4 “設備”テーブル又は“物件設備”テーブルに登録するSQL文の例(未完成)。設備テーブルへのINSERT文と,物件設備テーブルへ物件コード・設備コード・設置済個数を登録するSQL5を示す表。
表4 “設備”テーブル又は“物件設備”テーブルに登録するSQL文の例(未完成)。設備テーブルへのINSERT文と,物件設備テーブルへ物件コード・設備コード・設置済個数を登録するSQL5を示す表。
表5 追加・変更したテーブルの主な統計情報(未完成)。設備,新物件,物件設備の行数と各列の列値個数を示す未完成の統計情報表。
表5 追加・変更したテーブルの主な統計情報(未完成)。設備,新物件,物件設備の行数と各列の列値個数を示す未完成の統計情報表。
表6 移行後のSQL文の例(未完成)。新物件,物件設備,設備を結合して移行前の検索を再現するSQL6とSQL7の未完成例を示す表。
表6 移行後のSQL文の例(未完成)。新物件,物件設備,設備を結合して移行前の検索を再現するSQL6とSQL7の未完成例を示す表。
図3 ビュー“物件”の定義(未完成)。新物件と物件設備を外部結合し,沿線,エアコン,オートロックを表示するビュー定義の未完成SQLを示している。
図3 ビュー“物件”の定義(未完成)。新物件と物件設備を外部結合し,沿線,エアコン,オートロックを表示するビュー定義の未完成SQLを示している。
解き方のヒントを見る

移行前後で表す情報の対応を確かめる

表の構造を変える設計やSQLを検討するときは、変更前の表が表していた一つ一つの事実が、変更後の構造でどのように表されるかをひとつずつ対応付けて考えることが大切です。この観点に絞って、問われている箇所を確認しましょう。

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

問題が扱っている処理や設計が、元の構造で持っていた情報を変更後の構造で同じ意味のまま扱えるかという点に注目します。各要素が、どの時点のどの構造を前提にしているかを整理して読み進めてください。

視点

同じ事実でも、列に並べて持つ構造と行に分けて持つ構造では、表し方が異なります。どちらが優れているかを先に決めつけず、ある事実が一方の構造では何か所に、どのような形で記録され、もう一方ではどう現れるかを書き出してみましょう。取り出す、書き換える、確かめるといった操作がどちらの構造を前提にしているかを意識すると、判断の根拠を自分で説明しやすくなります。

確認ポイント

  • 変更前の構造で、一つの事実がどこにどのように記録されているかを自分の言葉で説明できるか
  • その同じ事実が、変更後の構造ではどこにどのように現れるかを対応付けられるか
  • 問われている処理や検証が、変更前と変更後のどちらの構造を前提にしているかを区別できているか
正解と解説を見る

解説

設備の有無を20個の列で持つ“物件”テーブルを、“設備”・“新物件”・“物件設備”の3テーブルへ移行する問題です。問われるのは、列値分布を使った結果行数の見積り、GROUP BYと集約、UNION ALLを使った行への展開、移行後の列値個数、内結合による同じ結果の再現、DISTINCTが必要になる理由、そして左外結合とCASE式で旧テーブルと同じ形を返すビューの定義です。

問題の全体像

A社の検索システムでは、“物件”テーブルがエアコンやオートロックなど最大20個の設備の有無をY/Nの列で持っています。そのため、設備を100個まで増やしたい、設置済個数も知りたい、という課題に対応できません。Kさんは“設備”“新物件”“物件設備”の3テーブルに分ける案Bを採用し、移行用のSQL、移行後の検証SQL、旧テーブル名で参照できるビューを設計しています。出題趣旨では、テーブル構造の変更が妥当かを評価した上で、SQL文の変更方法、移行手順、基本的なSQL構文、移行時に考慮すべき統計情報を理解しているかを問うとしています。採点講評では、全体の正答率は平均的だったとしています。

設問1(1)(イ)

表2では、行数が1、600、000、沿線の列値個数が400、エアコンとオートロックの列値個数がそれぞれ2(Y/N)です。設問の条件は「各列が独立し、一様分布に従う」です。沿線が○△線の物件は1、600、000÷400=4、000件です。そのうちエアコンが'Y'の割合は1/2、オートロックが'Y'の割合も1/2で、両方を満たすのは4、000×1/2×1/2=1、000件です。公式解答例でも1、000です。

設問1(1)(ロ)

SQL2の条件は、エアコンとオートロックのどちらかが'Y'(OR条件)です。両方とも'N'になる割合は1/2×1/2=1/4なので、少なくとも一方が'Y'になる割合は3/4です。沿線が○△線の4、000件に掛けて4、000×3/4=3、000件になり、公式解答例も3、000です。

設問1(1)(ハ)

SQL3では、沿線ごとに「両方の設備がある物件数」を数え、それを全物件数で割って百分率にします。WHERE句で両方の設備がある行に絞った上でGROUP BYしているので、分子は各グループの行数を数える集約関数になります。公式解答例ではCOUNT(*)です。

設問1(1)(ニ)

分母の全物件数は、WITH句で定義したTEMPのTOTAL列(SELECT COUNT(*) FROM 物件 の結果)をCROSS JOINで各行に付けたものです。したがって分母はTOTALで、公式解答例もTOTALです。

設問1(1)(ホ)

沿線ごとに集計するので、GROUP BYには沿線が必要です。さらに、選択リストのFLOOR式ではTOTALを集約関数の外で使っています。集約問合せでは、集約関数の外で参照する列をグループ化列に含める必要があるため、TOTALもGROUP BYに加えます。公式解答例は「沿線、TOTAL」です。TOTALは1行しかないCTEの値なので、グループ数は沿線の数と同じ400のままで、表3の見積り結果行数400とも合います。

設問1(2)

案Aのエアコン台数列の追加は、エアコンの個数しか解決せず、設備を増やすたびに列を追加するテーブル定義の変更も続きます。案Bでは、設備を“設備”テーブルの行として持ち、物件ごとの設置状況と設置済個数を“物件設備”テーブルの行で持ちます。公式解答例は、①物件設備の入替処理が不要になる、②全設備の有無と個数の問合せに答えられる、③将来増える設備に行の追加で対応できる、の三つです。本文の用語(物件設備の入替処理、設置済個数、100個・将来増える可能性)と結び付け、このうち一つを25字以内で書きます。

設問1(3)(a)

SQL5は、INSERT INTO 物件設備(物件コード、 設備コード、 設置済個数) に対して、SELECTの結果を登録するINSERT文です。SQL4からエアコンの設備コードは'A1'と分かり、本文には設置済個数列に仮に1を設定するとあります。よって選択リストは「物件コード、 'A1'、 1」で、公式解答例と同じです。

設問1(3)(b)

“物件設備”テーブルには、“物件”テーブルで設置されている設備に限って行を登録します。1行目のSELECTはエアコン用なので、条件は「エアコン='Y'」です。公式解答例では、aとbの組とdとeの組は順不同とされています。

設問1(3)(c)

エアコンの行を作るSELECTとオートロックの行を作るSELECTの結果を合わせて一度に登録するため、和集合の演算子を使います。二つの結果は設備コードが'A1'と'A2'で異なり、重複しないので、重複排除をしないUNION ALLで足ります。公式解答例はUNION ALLです。採点講評では、ANDやORとする誤答が散見されたとし、二つのSELECT文の結果行の和集合を求めていることに留意するよう述べています。

設問1(3)(d)

2行目のSELECTはオートロック用です。SQL4からオートロックの設備コードは'A2'なので、選択リストは「物件コード、 'A2'、 1」になり、公式解答例と同じです。

設問1(3)(e)

オートロックが設置されている物件に限って登録するので、条件は「オートロック='Y'」です。公式解答例も同じです。

設問1(4)(あ)

列値個数は、その列に現れる異なる値の数です。“物件設備”テーブルの物件コードの列値個数は、物件設備に1行以上登録された物件の数になります。物件設備の物件コードは“新物件”(表5で1、600、000件、物件コードの列値個数も1、600、000)の物件を指すので、上限は1、600、000です。公式解答例では、この上限と同じ1、600、000としています。採点講評では、物件設備の物件コードと設備コードの列値個数を「状況記述から読み取ることを求めた」と述べています。ただし、問題冊子の本文には「全ての物件に1個以上の設備がある」とは書かれていません。2.(4)が示しているのは、20個の各設備がいずれかの物件に設置されていることです。この解説では、公式解答例の値と「列値個数は異なる値の数であり、新物件の物件コード数を超えない」という考え方を押さえることを重視します。

設問1(4)(い)

移行手順(4)では、“物件設備”テーブルに“物件”テーブルにある設備に限って行を登録するとしています。そのため、登場し得る設備コードは“物件”テーブルの設備列に対応する20個に限られます。本文2.(4)には「記録されている20個の設備について、どの設備もいずれかの物件に設置されている」とあるので、20個の設備コードはどれも少なくとも1行は登録されます。したがって列値個数は20で、公式解答例と一致します。“設備”テーブルには100個が登録されていますが、残り80個の設備は物件設備にまだ行がありません。この点に注意が必要です。採点講評では、(4)は物件コードより設備コードの正答率が低かったとし、列値個数は物理設計や性能見積りに欠かせない基本的な統計情報であると述べています。

設問2(1)(f)

SQL6とSQL7は、SQL1とSQL2と同じ結果行を得るためのSQLです。つまり、指定した設備の行が物件設備にある物件だけを残せばよいので、結合相手がない物件を除く内結合を使います。公式解答例ではINNER JOINです。

設問2(1)(g)

物件設備と設備を結合して設備名などで絞り込む部分も、条件に合う設備がある行だけを残せばよいので内結合です。公式解答例ではgもINNER JOINです。

設問2(1)(h)

SQL6では、物件設備と設備をBS1/S1とBS2/S2として2回結合し、エアコンとオートロックの両方がある物件を求めます。S1側の条件はエアコンで、公式解答例は「S1.設備名='エアコン'」または「S1.設備コード='A1'」です。採点講評では、設備コードを参照する場合、どのテーブルの列かのあいまいさを排除するため、相関名で修飾しなければならないと注意しています。

設問2(1)(i)

S2側の条件はオートロックで、公式解答例は「S2.設備名='オートロック'」または「S2.設備コード='A2'」です。hとiは順不同とされています。二つの内結合をそれぞれ別の設備で絞り込むことで、SQL1のAND条件(両方がある)を表しています。

設問2(1)(j)

SQL7はSQL2(エアコン又はオートロック)に対応し、物件設備と設備を1回だけ結合します。そのため、条件はどちらかの設備に当たるOR条件になり、前のANDとの優先順位を保つために括弧で囲みます。公式解答例は「(S.設備名='エアコン' OR S.設備名='オートロック')」または「(S.設備コード='A1' OR S.設備コード='A2')」です。

設問2(2)

SQL7では、1物件について条件に合う物件設備の行ごとに結合結果が1行できます。エアコンとオートロックの両方が設置されている物件は、'A1'の行と'A2'の行の2行と結合するため、同じ物件コード・物件名が2行出力されます。これを1行にまとめるのがDISTINCTの目的です。公式解答例は「エアコンとオートロックの両方が設置されている場合」で、30字以内にこの要素を入れます。

設問2(3)(k)

ビューでは、BS1をエアコン('A1')の行に限って外結合します。そのため、BS1の行が結合できたかどうか(BS1側がNULLでないかどうか)で、エアコンの有無を判定できます。公式解答例は「BS1.設備コード='A1'」または「BS1.設備コード IS NOT NULL」です。

設問2(3)(l)

旧“物件”テーブルの設備列は、表1のとおり設置ありを'Y'で表していました。既存のSQL文をそのまま使えるように、設置ありのときは'Y'を返します。公式解答例は'Y'です。

設問2(3)(m)

設置なしの場合は、旧テーブルと同じく'N'を返します。公式解答例は'N'です。旧テーブルでは全列にNOT NULL制約がありました。ELSEでNULLではなく'N'にすることで、既存SQLの「= 'N'」などの条件がそのまま働きます。

設問2(3)(n)

“物件設備”テーブルには、設置されている設備の行しか登録されていません。内結合にすると、エアコンやオートロックがない物件がビューから消えてしまいます。全物件を残し、相手がない場合にNULLを補って'N'と判定するには、左外結合が必要です。公式解答例はLEFT OUTER JOINです。採点講評では、この左外結合を選択できるかを問うたが正答率は低かったとし、エアコン又はオートロックがある物件だけを登録していることと、列値が'N'の行も求めることに留意するよう述べています。

設問2(3)(o)

BS1をエアコンの行に限定する条件は、WHERE句ではなく外結合のON句に書きます。WHERE句に書くと、結合できずNULLになった行が除外されて内結合と同じ結果になります。公式解答例は「BS1.設備コード='A1'」です。網掛けになっているBS2側も、同じ考え方でオートロックの行に限定する条件になります。

学習のポイント

繰り返し列を行に分ける正規化型の移行で、結合の種類(内結合・左外結合)、UNION ALL、列値個数の読み取り方を確実に押さえることが重点です。

出典:独立行政法人 情報処理推進機構(IPA)令和3年度秋期 データベーススペシャリスト試験 午後Ⅰ 問3(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

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