HOME»基本情報技術者平成27年秋期問題»午後問3
基本情報技術者過去問題 平成27年秋期 午後問3
⇄問題文と設問を画面2分割で開く⇱問題PDF問3 データベース
電子部品の出荷データを管理する関係データベースの運用に関する次の記述を読んで,設問1~4に答えよ。
C社は,電子部品を製造販売する会社である。
ある期間に出荷した特定の電子部品について,製造装置の設定ミスによる不具合が発生しているおそれがあるので,顧客への連絡と出荷済みの電子部品の無償交換(回収及び再出荷。以下,リコールという)を実施することにした。
出荷情報は,図1に示す表で管理されている。下線付きの項目は主キーを表す。
C社は,電子部品を製造販売する会社である。
ある期間に出荷した特定の電子部品について,製造装置の設定ミスによる不具合が発生しているおそれがあるので,顧客への連絡と出荷済みの電子部品の無償交換(回収及び再出荷。以下,リコールという)を実施することにした。
出荷情報は,図1に示す表で管理されている。下線付きの項目は主キーを表す。
設問1
リコールの対象となる電子部品の出荷先の顧客番号,顧客名,出荷番号,出荷日,出荷数を,顧客番号の昇順に表示する。リコールの対象となる電子部品の部品番号は"007551"で,出荷日は 2015年1月10日 から 2015年1月20日 までである。次のSQL文のaに入れる正しい答えを,解答群の中から選べ。
a に関する解答群
解答選択欄
- a:
解答
- a=ウ
解説
SQLにおいて日付での絞り込みなど、ある列の値が一定範囲内であるレコードを抽出したいときにはWHERE句で BETWEEN句 を使用します。
∴a=ウ
WHERE 列名 BETWEEN 下限値 AND 上限値
設問では"出荷表"内で部品番号が'007551'であるレコードをリコール対象の「出荷日が2015年1月10日から2015年1月20日まで」に絞り込むため、aにはBETTWEEN句を使用した以下のSQL文を記述するのが適切です。WHERE 出荷表.出荷日 BETWEEN '20150110' AND '20150120'
∴a=ウ
- 出荷日が2015年1月10日、又は、2015年1月20日のレコードだけが抽出されます。
- ANY句は指定した値と副問合せの結果を比較するときに使用します。このケースでは出荷日が2015年1月10日、若しくは2015年1月20日のレコードだけが抽出されます。
- 正しい。
- IN句は指定した値と値の集合を比較するときに使用します。このケースでは出荷日が2015年1月10日、又は、2015年1月20日のレコードだけが抽出されます。
設問2
C社では,電子部品を単品で出荷するだけでなく,複数の電子部品を同梱(こん)したパッケージも出荷している。このパッケージにも一意の部品番号が割り振られている。パッケージの同梱部品の情報は,図2に示すパッケージ表で管理されている。
リコールの対象となる電子部品がパッケージにも含まれていることが判明したので,該当するパッケージの出荷情報も含めて表示するよう設問1のSQL文を変更する。次のSQL文のbに入れる正しい答えを,解答群の中から選べ。ここで,aには設問1の正しい答えが入っているものとする。また,パッケージの同梱部品にパッケージが含まれることはない。
リコールの対象となる電子部品がパッケージにも含まれていることが判明したので,該当するパッケージの出荷情報も含めて表示するよう設問1のSQL文を変更する。次のSQL文のbに入れる正しい答えを,解答群の中から選べ。ここで,aには設問1の正しい答えが入っているものとする。また,パッケージの同梱部品にパッケージが含まれることはない。
b に関する解答群
解答選択欄
- b:
解答
- b=エ
解説
抽出条件したいレコードの条件を整理してみると、
1つ目の条件を指定している文は、どの選択肢にも共通している以下の部分となります。
残る「ウ」と「エ」ですが、次のように考えます。
この副問合せでしたいことは、パッケージ表から同梱部品に'007551'を含むレコードの部品番号(パッケージ番号)のリストを抽出することです。このリストを出荷表の部品番号とANYで比較することで、そのパッケージがリコール対象であるかどうかの判別を行います。ANYは、値リストのそれぞれと比較して、いずれかが真ならば真を返す演算子です。
パッケージ表からリコール対象の部品番号のリストを得るには、WHERE句に「同梱部品 = '007551'」を指定することで、同梱部品が'007551'であるレコードを選択し、「SELECT 部品番号」で、そのレコードの部品番号列を抜き出すことになります。
したがって「エ」のSQL文が適切とわかります。
∴b=エ
- 出荷表の部品番号が'007551'である
- 出荷表の部品番号が、同梱部品として'007551'を含むパッケージである
1つ目の条件を指定している文は、どの選択肢にも共通している以下の部分となります。
出荷表.部品番号 = '007551'
次に1つ目と2つ目の条件を結んでいる部分に着目すると、「ア」「イ」では AND、「ウ」「エ」では OR となっています。このSQL文では「条件1または条件2」に合致するレコードを抽出したいため、条件1と条件2の結合演算子は OR とするのが適切です。したがってこの時点で「ア」「イ」は選択肢から除外することができます。残る「ウ」と「エ」ですが、次のように考えます。
この副問合せでしたいことは、パッケージ表から同梱部品に'007551'を含むレコードの部品番号(パッケージ番号)のリストを抽出することです。このリストを出荷表の部品番号とANYで比較することで、そのパッケージがリコール対象であるかどうかの判別を行います。ANYは、値リストのそれぞれと比較して、いずれかが真ならば真を返す演算子です。
パッケージ表からリコール対象の部品番号のリストを得るには、WHERE句に「同梱部品 = '007551'」を指定することで、同梱部品が'007551'であるレコードを選択し、「SELECT 部品番号」で、そのレコードの部品番号列を抜き出すことになります。
したがって「エ」のSQL文が適切とわかります。
∴b=エ
設問3
今回のリコールの対象となる電子部品の出荷金額の合計を表示する。次のSQL文のcに入れる正しい答えを,解答群の中から選べ。ここで,aとbには設問1及び設問2の正しい答えが入っているものとする。
c に関する解答群
- AVG(出荷表.出荷金額)
- COUNT(出荷表.出荷金額)
- MAX(出荷表.出荷金額)
- SUM(出荷表.出荷金額)
解答選択欄
- c:
解答
- c=エ
解説
SUM()は、値の合計を算出して出力する集計関数です。SUM()を使用することで抽出されたレコードの"出荷金額"列の値の合計値を出力することができます。
∴c=エ
∴c=エ
- AVG()は、平均を算出する集計関数です。"出荷金額"列の値の平均が出力されることになるため不適切です。
- COUNT()は、行数を数えて出力する集計関数です。抽出されたレコード数が出力されることになるため不適切です。
- MAX()は、最大値を出力する集計関数です。"出荷金額"列の値のうち最大である値が出力されることになるため不適切です。
- 正しい。
設問4
回収の対象となった出荷の情報は残したまま,再出荷に関する情報を管理することができるように,表の構成を変更する。次の記述中の に入れる適切な答えを,解答群の中から選べ。
図1及び図2の表に回収及び再出荷の情報を追加する場合,dに回収日と再出荷番号の項目を追加し,初期値には NULL を設定しておき,回収対象の場合には回収した日と再出荷時の出荷番号を設定すればよい。ただし,この方法では既存データヘの影響が大きく,また,リコールの頻度が低い場合は効率が悪い。
そこで,既存データに影響を与えない方法として,新たに回収表を作成して,一意に割り振った回収番号,回収対象となった出荷の出荷番号,回収日,再出荷時の出荷番号を格納する方法を考えた。この方法では,例えば,ある月の出荷金額の合計を求めるとき,回収対象となった出荷の出荷金額を除いて求めたい場合は,eから集計できる。
図1及び図2の表に回収及び再出荷の情報を追加する場合,dに回収日と再出荷番号の項目を追加し,初期値には NULL を設定しておき,回収対象の場合には回収した日と再出荷時の出荷番号を設定すればよい。ただし,この方法では既存データヘの影響が大きく,また,リコールの頻度が低い場合は効率が悪い。
そこで,既存データに影響を与えない方法として,新たに回収表を作成して,一意に割り振った回収番号,回収対象となった出荷の出荷番号,回収日,再出荷時の出荷番号を格納する方法を考えた。この方法では,例えば,ある月の出荷金額の合計を求めるとき,回収対象となった出荷の出荷金額を除いて求めたい場合は,eから集計できる。
d に関する解答群
- 顧客表
- 出荷表
- パッケージ表
- 部品表
e に関する解答群
- 出荷表と回収表
- パッケージ表と回収表
- 部品表と回収表
- 部品表と出荷表とパッケージ表
- 部品表とパッケージ表と回収表
解答選択欄
- d:
- e:
解答
- d=イ
- e=ア
解説
〔dについて〕
回収と再出荷は、出荷表のレコード単位で行うため2つの項目を追加して管理を行うには出荷表が適切と言えます。
d=イ:出荷表
〔eについて〕
ある月の出荷金額は、その月に発生した全ての出荷の出荷金額から回収対象となった出荷金額を減じて算出します。回収表には回収対象となった"出荷番号"が登録されているため、以下の手順である月の出荷金額が計算可能です。
∴e=ア:出荷表と回収表
回収と再出荷は、出荷表のレコード単位で行うため2つの項目を追加して管理を行うには出荷表が適切と言えます。
d=イ:出荷表
〔eについて〕
ある月の出荷金額は、その月に発生した全ての出荷の出荷金額から回収対象となった出荷金額を減じて算出します。回収表には回収対象となった"出荷番号"が登録されているため、以下の手順である月の出荷金額が計算可能です。
- "出荷表"より出荷日がその月であるレコードを抽出する
- 1.で抽出したレコードの集合から"回収表"内に出荷番号が含まれるレコードを除外する
- SUM()関数を使用して2.の結果のレコードの出荷金額の合計を出力する
∴e=ア:出荷表と回収表