【過去問解説】平成30年度春期 基本情報技術者試験 データベース(午後 問3)

平成30年度春期 基本情報技術者試験 午後問3

問3 子供会の名簿データベース

難易度:★★★☆ 普通

設問1の概要

4つある選択肢の中から「6年生の保護者の氏名と住所」を抽出するSQL文を選択する問題です。SQLをある程度理解していれば、ウが正解なのは何となく理解できると思うので、反対に「なぜウ以外が不正解なのか?」を実際にSQLを動かしながら解説します。

その前に各テーブルの状況を確認しましょう。問題文に記載されている行に対していくつか独自の行を加えているのでご注意ください。

 

保護者表(parents)

保護者番号

parent_no

保護者氏名

name

電話番号

phone_number

住所

address

12021

情報花子 03-1111-2222 東京都**区1-2-3
12022 麻生太郎 03-2222-2222 東京都**区1-1-1
12023 小泉純一郎 03-1111-1111 東京都**区9-9

 

児童表(children)

児童番号

child_no

児童氏名

name

学年

grade

保護者番号

parent_no

12027 情報一郎 6 12021
14021 情報二郎 4 12021
15000 麻生太郎ジュニア 6 12022
15001 小泉進次郎 1 12023

 

活動表(activities)

児童番号

child_no

イベント番号

event_no

12027 18001
12027 18002
14021 18001
15000 18001
15000 18002
15000 18003

 

 イベント表(events)

イベント番号

event_no

イベント名

event_name

開催日

event_date

18001 歓迎会 2018-04-07 00:00:00
18002 地域清掃 2018-04-14 00:00:00
18003 ソフトボール大会 2018-04-21 00:00:00

 

設問1の選択肢は下記の通りです。

ア SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所

  FROM 保護者表

  WHERE 保護者表.保護者番号 NOT IN

   (SELECT 児童表.保護者番号 FROM 児童表 WHERE 児童表.学年 = 6

イ SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所

  FROM 保護者表, 児童表

  WHERE 児童表.学年 = 6

  GROUP BY 保護者表.保護者氏名, 保護者表.住所

ウ SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所

  FROM 保護者表, 児童表

  WHERE 保護者表.保護者表番号 = 児童表.保護者番号 AND 児童表.学年 = 6

エ SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所

  FROM 保護者表, 児童表

  WHERE 保護者表.保護者表番号 = 児童表.保護者番号

  GROUP BY 保護者表.保護者氏名, 保護者表.住所 HAVING 児童表.学年 = 6

出所:

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_fe_pm_qs.pdf

実際にSQLを実行してみた

「6年生の保護者の氏名と住所」を抽出するSQLですので、6年生の情報一郎の親である「情報花子」と6年生の麻生太郎ジュニアの親である「麻生太郎」が抽出されるのが期待値となります。

早速SQLを実行してみましょう。以下は正答であるウのSQLを私のデータベース上で動作できるように書き換えたものです。


SELECT DISTINCT parents.name, parents.address
FROM parents, children WHERE parents.parent_no = children.parent_no and children.grade = 6;

保護者氏名

parent_name

住所

address

情報花子

東京都**区1-2-3
麻生太郎 東京都**区1-1-1

 

期待通りの結果になりました。 

このSQLについての解説はあえて省略し、ア、イ、エについて解説していきます。

 

アのSQLを考える

ア SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所

  FROM 保護者表

  WHERE 保護者表.保護者番号 NOT IN

   (SELECT 児童表.保護者番号 FROM 児童表 WHERE 児童表.学年 = 6)

 このSQLでは副問合せを使用しています。副問合せとは、ある問合せ(SELECT)を実現するために、その問合せの中で使用される問合せ(SELECT)のことです。具体的には(SELECT 児童表.保護者番号 FROM 児童表 WHERE 児童表.学年 = 6)」の部分を指します。

副問合せの結果は以下の通りです。6年生の児童の行をWHERE句で抽出した後、「保護者番号」の列だけを取得しています。6年生の子供を持つ情報花子と麻生太郎の保護者番号が抽出されています。

保護者番号

parent_no

12021

12022

この副問合せでは外への参照(外側の問合せで使用する列を副問合せ中で使用すること)がないので、副問合せはSQL全体で一度だけ実行され、保持された実行データに対して主問合せ(SELECT DISTINCTの方)の各行を比較することになります。このことは問題を解くうえで意識する必要はありませんが、SQLのパフォーマンスを考えるうえで重要なポイントです。ちなみに、外への参照がある場合は主問合せの1行ずつ、副問合せが毎回実行されることになります。

次に、副問合せの結果に対する主問合せの検索条件を見てみましょう。 

WHERE 保護者表.保護者番号 NOT IN (副問合せ)

「列名 IN 副問合せ」を使うと、主問合せの1行ずつについて「副問合せの結果のいずれかと合致しているか?」を評価し、評価が真(いずれかと合致している)となった主問合せの行を抽出します。ちなみに、「列名 IN 副問合せ」と「列名 =ANY 副問合せ」は等価です。反対に「NOT IN」の場合は「副問合せの結果のいずれにも合致していない(すべて異なる)」場合に評価が正となります。

このSQLでNOT INを使っているということは・・・?

保護者表の行の中から、副問合せで抽出した「6年生の子供の親の保護者番号」の結果のいずれにも合致していない行が抽出されます


SELECT DISTINCT parents.name, parents.address
FROM parents WHERE parents.parent_no NOT IN (SELECT children.parent_no FROM children WHERE children.grade=6);

保護者氏名

parent_name

住所

address

小泉純一郎

東京都**区9-9

 

「NOT」がついているがために不正解となりますが、「IN」であれば、「6年生の子供の親の保護者番号」の結果のいずれかに合致する行を抽出するため正解となります。

ちなみに、EXISTSで「6年生の保護者の氏名と住所」を抽出する場合は以下のようなSQLになります。EXISTSは、主問合せの各行を評価したとき、副問合せの結果が1行以上になるような主問合せの行を結果として返します

先ほど少し言及した「外への参照」を含むSQLになっているため、このSQLは主問合せの行ごとに副問合せが実行されることになります。したがって、外への参照のないINの方が無駄が少ないです。数行、数百行レベルのテーブル同士であれば性能の差は微々たるものですが、100万、1000万行レベルになると秒単位の差が出てくる可能性もあります。ただ、SQLの内容や主問合せ・副問合せのデータ量によってパフォーマンスが決まるので、一概に「INの方がEXISTSよりも速い」ということはできません。


SELECT DISTINCT parents.name, parents.address
	FROM parents
    WHERE EXISTS
		(SELECT * FROM children WHERE children.parent_no = parents.parent_no and children.grade=6);

 

?

広告

 

設問2以降は気が向いたら更新します。。

またはリクエストがあれば記事化します。

 

解説について

・解説が明らかに誤っている場合はご連絡ください。

 

問題冊子・公式解答

IPA 独立行政法人 情報処理推進機構:問題冊子・配点割合・解答例・採点講評(2018、平成30年)

基本情報(FE)の勉強時に使用したテキスト(最新版)

 

広告

【解答速報】平成30年度春期 応用情報技術者試験 データベース(午後問6)

平成30年度春期 応用情報技術者試験 午後問6

問6 備品購買システムの設計と実装

難易度:★★★☆ 普通

設問1

a: 希望回答日

表1のNo.2の説明の中で唯一、希望回答日だけが属性として管理されていないため

b: -

発注に対する全ての納品を1単位として1レコード生成すると考えられるため(表1のNo.6の説明より)

c:

1発注に対して複数納品が起こりうるため(表1のNo.5の説明より)

 

設問2

d: 見積依頼番号

e: 取引先番号

取引先ごとの見積依頼を管理するエンティティであるため

f: 見積依頼明細

相見積り機能実装により、1見積依頼に対して複数取引先が存在することになる

取引先ごとに商品番号が異なることを考慮すると(表1のNo.2の説明)、見積依頼明細は”二つ目のエンティティ”に対してリレーションシップを保持する必要があるため見積依頼明細に取引先番号を追加する必要がある

?

広告


設問3

g: DLI.納品数量計

表示すべき内容の中に”納品された数量”があるため

h: OD.発注番号 = :発注番号

逆にこれがないと指定した発注番号以外の商品も出てきてしまうため

i: GROUP BY DE.発注番号, DD.商品番号

1発注:複数納品のルールがあり、SELECTでも集合関数(SUM)が使用されているため

j: ORDER BY ORD.商品番号 ASC

商品番号の昇順で一覧表示との記載があるため

 

設問4

× 返品した商品の商品番号、商品名、及び数量を記録したレコード

◯ 返品した商品の数量が負の値で記録されたレコード

(いい文言が思いつきませんでしたが、ニュアンスとしては上記の通りです)

rabasoさん、情報提供ありがとうございます!

 

解説について

・明らかに解説が誤っている場合はご連絡ください。

・2018年5月31日までの間は随時追記・修正実施予定です。

問題冊子・公式解答

IPA 独立行政法人 情報処理推進機構:問題冊子・配点割合・解答例・採点講評(2018、平成30年)

応用情報の勉強時に使用したテキスト(最新版)

 

広告

【過去問解説】平成29年度春期 応用情報技術者試験 ネットワーク(午後 問5)

平成29年度春期 応用情報技術者試験 午後問5

問5 レイヤ3スイッチの故障対策

難易度:★★★普通

設問1

a:どのノードに対してpingコマンドを実行したのかが問われています。DNSサーバの経路障害を疑う一文が解答欄aの直前にあるため、DNSサーバとの通信を調査したいことが分かります。

したがって答えはa:イです。

b:OSPFがルーティングプロトコルであることを知っていれば、その内容を知らなくても解答できるはずです。ルーティングプロトコルを設定すれば、ルータ間の経路情報を自動的に交換することが可能となります。この方式は、経路情報を管理者が事前に設定する"静的"経路制御と対をなすものであり、"動的"経路制御というものです。

したがって答えはb:コです。

c:問題文をよく見ると、PCのデフォルトゲートウェイは図1から変更していないとの記述があります(27ページ4行目)。図1では、PCから一番近いL3SWのポートはL3SW1のp10となっており、図2ではこのポートに171.16.2.250と明記されています。

したがって解答はc:オです。

d:L3SW1のp1が故障しているため、L3SW1を経由したPCからのサーバアクセスは不可能となります。したがって、PCがサーバにアクセスするためにはL3SW2を経由しなければなりません。つまり、PCから「ファイルサーバにアクセスしたい」というパケットが到着したときには「L3SW2を訪ねてください」とPCに伝えるためにルーティングテーブルを更新する必要があります

よって答えはd:カです。

e:サーバにアクセスしようとするPCはL3SW1の故障を知らないため、デフォルトゲートウェイであるL3SW1にパケットを送ります。しかし、L3SW1経由ではサーバアクセスできないため、L3SW1がこの事実を送信元ホストであるPCに伝達する必要があります。このような場合に、最適ではない経路を使用しているホストに対して最適な経路情報を通知する機能がICMPリダイレクトです

よって解答はe:クとなります。

?

設問2(1)

K君のPCでpingコマンドを実行した理由が問われています。いま、J君のPCからは業務サーバを利用できているがK君のPCからは利用できない状態です。この事象をOSI参照モデルをもとに考えてみると、「利用できるという状態=ネットワーク層のレベルで接続できている+ネットワーク層より上位層が正常に動作している」と切り分けることができます。

IPアドレスを使ってpingコマンドを実行することで相手先ホストにIPパケットが到達するかどうか(=ネットワーク層のレベルで接続できているか)を調べることができます。pingコマンドの実行の結果、パケットが到達しない場合は経路上に何らかの問題があるといえますし、反対に、パケットが到達すればネットワーク層の段階では問題なく接続できているといえるでしょう。

したがって、解答としては「業務サーバへの経路に障害があるかどうかを確認するため」となります。


設問2(2)

問題に答える前に、J君がDNS周りの障害であると判断した根拠が何なのか考えていきましょう。まず問題文に書かれている事象を整理します。

  • 業務サーバは正しく動作しているが、一部のサーバからは利用できておらず、IPアドレスをもとにしたpingコマンドを実行すると正しく到達していること。
  • 他の社員から、ファイルサーバや営業支援サーバも利用できないという連絡があった。

これらのことから以下のことが分かります。

  • 業務サーバ、ファイルサーバ、営業支援サーバは正常に動作している。
  • 人によって利用できないサーバが異なる。
  • 業務サーバ、ファイルサーバ、営業支援サーバいずれについてもIPアドレスによる通信は正常である(業務サーバへのping結果からの類推)

これらのことから、IPアドレスを使用した通信は正しく行われているが、それ以外の何かを使った通信ができていないと言えそうです。つまり、FQDNの名前解決が行えていないのです。例えば業務サーバに「Gyomu-Server」という名前を付け、それとIPアドレスとを紐づけていたとします。DNSが正しく動作していれば、PCから「Gyomu-Server」へアクセスがあった場合、それと紐づくIPアドレス172.16.1.1をPCに伝えることで正しく通信できることになるわけです。

さて、問題に戻りましょう。DNSサーバが利用できない状況でなぜサーバを利用できているのでしょうか。答えは簡単、DNSサーバを使わずに各種サーバにアクセスしているためです。サーバにアクセスするたびにDNSに問い合わせるのは非効率的ですので、PCはDNS情報を一時的にPC内に保持しています(キャッシュ)。

したがって解答は「PCにDNSのキャッシュが残っているから」です。

 

設問3

L3SW1のp1故障時にルーティングテーブルがどのように更新されるかが問われています。P1が故障しているのですから、それに対応する項番1の内容を変えなければなりません。設問1のdの解答より、各種サーバにアクセスするためには172.16.2.251にアクセスする必要があります。L3SW1にサーバ向けのパケットが到着したとき、そのパケットは172.16.2.251方向に転送されるのが適当です。

したがって、VLANインターフェースはp10と紐づく「172.168.2.250」、VLAN名は「VLAN20」となります

 

設問4(準備中)

準備中です。

解説について

・解答(太字部分)は

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_1/2017h29h_ap_pm_ans.pdf から引用しています。

・明らかに解説が誤っている場合はご連絡ください。

問題冊子・公式解答

IPA 独立行政法人 情報処理推進機構:問題冊子・配点割合・解答例・採点講評(2017、平成29年)

参考文献

応用情報の勉強時に使用したテキスト(最新版)

にほんブログ村 資格ブログ IT系資格へ
にほんブログ村

 

【2017年2月更新】データベーススペシャリスト試験に合格するための勉強法

こんにちは。ゆきはら@window5296)です。

次回のデータベーススペシャリスト試験に挑戦しようと、勉強を開始した人も多くなっている頃だと思うので、一発合格までの私の道のり(勉強の方法や工夫など)を共有しようと思います。

データベーススペシャリスト試験とは?

ざっくり言うと… 

  • データベースに関する知識・技能を問う国家試験
  • 年1回(4月中旬)実施
  • 応募者数15,355名 / 合格率17.6% / 合格者平均年齢31.9歳 (平成27年度)

   (出所:IPA, 情報処理技術者試験 統計資料 平成27年度, https://www.jitec.ipa.go.jp/1_07toukei/toukei_h27.pdf

 

挑戦した理由

  • データベースに関連する基本的な知識・技術を習得し、実際のシステム開発業務(要件定義、設計、開発など)に活かすため
  • 上流SEが習得すべきであろうモデリング能力を身につけるため

 

学習期間

  • 6か月(約180日間)

 

テキスト

  

※合格教本は平成26年度版、重点対策は2016年版を使用。
※重点対策は解説がひどかったのでおすすめしません。

 

選択した設問

  • 午後Ⅰ 問1 データベース基礎理論、問2 データベース設計
  • 午後Ⅱ 問2 概念データモデル(おすすめ)

  ※午後Ⅱの問2は、問1と比較して試験内容が固定的なので過去問学習で対応しやすいです。

 

試験対策(午前・午後共通)

6か月使ってゆっくりとテキスト学習を進めました。

一区切りついたら章末問題など、午前Ⅱ問題を解き、理解度を確認します。

そこでは、"なんとなく"で解かず、"論理的に"解くように心がけました。例として以下の問題で考えてみましょう。

データベースの論理モデルに関する記述のうち、適切なものはどれか。

ア 階層モデルは、多対多のレコード関係を表現するのに適している。

イ 関係モデルでは、子レコードはただ一つの親レコードに属する。

ウ ネットワークモデルは、行と列からなる表で表現できる。

エ ボイス・コッド正規形は、関係モデルで使用される形式である。

(出典:平成20年度 春期 DB試験区分 午前 問29)

"なんとなく"で解くと ...

「んー・・・ボイス・コッドは正規化で勉強した気がするから「エ」が正解かな~」という具合で正解してしまいます。これの怖いところは、

完全に理解できていないのに理解しているような気分になってしまうことですね。試験本番で間違いなく爆発します。

"論理的に"解くと...

「階層モデルにおいて、親レコードは子レコードに対して一つのみ許される。したがって、多対多で表現すると主張しているアは間違いである。(略)そして、ボイス・コッド正規形は関係モデルにおける正規形の一つであるので正解はエである。」

 実際ここまで細かく考えてはいませんが、上記のように「なぜ正解/不正解といえるのか?」を明確にしながら解答を出すようにしました。

この解き方であれば、「あれ?階層モデルの定義ってどうだったっけ?」とか「関係モデルの表現方法って表?レコード?」とか、いろいろと気づくことが多くなります。

 

試験対策(午後Ⅰ)

以下の流れで学習を進めました。

  1. 応用情報技術者試験の過去問(DB)を解く ×約10問
  2. 午後Ⅰの過去問を解く ×約10問
  3. ②で解いた過去問を再び解く

①では、関数従属性や正規化理論、SQLなど、データベースの基礎知識を身につけるとともに、アウトプット力の基礎をつくります。

②の過去問学習は、試験対策としては当然ですが、単に解いて終わりにしないよう注意しました。答え合わせをして自分の解答が間違っていた場合、解答例をじっくり見て内容を理解するのではなく、まず解答例の概要だけざっくり確認します。

そして、その概要を念頭に置きつつ、テキストやノートを読み返してでも、自分なりの答えを出すようにするのです。解答を覚えるのではなく、それに至るまでの論理を理解するところがポイントですかね。

また、重視すべき学習分野は関数従属性と正規化理論です。特に、正規化理論は確実に理解すべきです。なぜ正規化する必要があるのか、正規化しないとどのような問題が起こるのか、いつでもスラスラと論述できるくらいには理解しておきましょう。

②の過去問学習も重要ですが、③も重要だと思っています。②での学習を通じて「理解した!」と思っても、案外理解できていなかったりするので、再び解いて理解度を確認します。もしまた間違えたなら、重点的に学習するのみです。

?

 

試験対策(午後Ⅱ)

過去問は5、6問ほどしか解いていないと思います。ただ、以下の2点に留意しました。

  1. 午後対策本に頼らない
  2. 過去問は1度にすべて解かない

①はですね...頼らないというより頼れませんでした。詳細は言及しませんが、ほんと××みたいな解説で本に何回ブチ切れたことか。

頼るものがなかった私は、ひたすら自分の頭で考えて解答を作っていきました。取り組み方は、午後Ⅰの対策ですでに述べた、「論理的に解く&自分なりの答えを出す」と同じです。

仮に午後対策本に頼っていたとしたら落ちていたかもしれません。というのも、分かりやすい解説を見ると、なんとなく理解したつもりになってしまうからです。これも午後Ⅰの対策で述べたことと関連しています。

 

②は意外に重要です。 午後Ⅱの問題を解き、答え合わせをして振り返りをしようものなら、少なくとも3時間はかかります(1問あたり)。ここで懸念すべきは、試験勉強をしている人の心理です。

例えば、「毎週日曜日に午後Ⅱを1問解く」と計画を立てているとしましょう。計画したのですから、その人は可能な限り計画通りに進むことを願っています。そして実際に1問解き始めます。

おそらく、「難しい」「早く遊びたい」「あーせっかくの土日が...」という思いが沸き上がってきます。そうなると、「んー、まあこんなもんでいいだろう」と中途半端に勉強を終え、"勉強したことにする"のです。

あくまでも私の実体験に基づく予想ですが、そうなってしまう方も多いのではないでしょうか。

以上のことから、午後Ⅱの問題は数回に分けて解答・学習することをすすめます。

私の場合は解答と振り返り学習を2日に分けるようにしました。解答するときは解くことだけに集中し、振り返るときは苦手分野の学習と学びの概念化(教訓を生み出す)だけに注力するわけです。

問題を解くなかで分からなかった部分には?マークを付し、振り返りの際には、解答と異なる部分と?マークの部分を重点的に学習します。もちろん例によって、解答や解説に頼らず、自分なりの答えを出します。

 

試験結果(平成28年度春期試験)

 f:id:window5296:20160731150433p:plain

高得点ではありませんが、午後試験でも十分な結果を出すことができました。

 

最後に一言

情報システムに関わる人間にとって、「どうやってデータを扱うか?」ということを学ぶことは大切なことだと思います。

実務経験のないor少ない方でも合格できるので、これからITエンジニア、ITコンサルタントを目指す方は挑戦してみてはいかがでしょうか。

にほんブログ村 資格ブログ IT系資格へ
にほんブログ村