平成22年春期午後問4

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
王女姉妹さん  
(No.1)
https://www.fe-siken.com/kakomon/22_haru/pm03.html

平成22年春期午後問4の答えがアになる理由がわかりません。

また、イ、ウ、エは何を行っているのかも教えてください。
2021.06.24 20:11
かなさん 
FE ブロンズマイスター
(No.2)
生徒表, 成績表の例を示してご説明いたします。(試験表は試験名の表示にしか使わないテーブルなので省略)

      生徒表
生徒番号    氏名
  0001    情報太郎
  0002    いいいい

成績表
生徒番号  年度    試験ID  国語
  0001      1      0001     5
  0001      1      0002    10
  0002      1      0001    35
  0002      1      0002    40

ウエは突っ込みどころが満載なため、すぐに「これではない」とわかります。

「FROM 生徒表, 成績表」を実行した時、内部では以下のような表が作られます。
生徒番号    氏名      生徒番号  年度    試験ID  国語
  0001    情報太郎      0001      1      0001     5
  0002    いいいい      0001      1      0001     5
  0001    情報太郎      0001      1      0002    10
  0002    いいいい      0001      1      0002    10
  0001    情報太郎      0002      1      0001    35
  0002    いいいい      0002      1      0001    35
  0001    情報太郎      0002      1      0002    40
  0002    いいいい      0002      1      0002    40

この操作を直積と言いますが、この操作では生徒表の生徒番号と成績表の生徒番号が一致していない行同士もつなげてしまいます。
こうした行を抽出(選択)の対象から取り除くために、「WHERE 生徒表.生徒番号 = 成績表.生徒番号」を実行する必要があるのです。

「FROM 生徒表, 成績表」に続いて「WHERE 生徒表.生徒番号 = 成績表.生徒番号」を実行した後の表は以下のようなイメージです。

生徒番号    氏名      生徒番号  年度    試験ID  国語
  0001    情報太郎      0001      1      0001     5
  0001    情報太郎      0001      1      0002    10
  0002    いいいい      0002      1      0001    35
  0002    いいいい      0002      1      0002    40

ここから「AND 氏名 = "情報太郎"」を実行すれば

生徒番号    氏名      生徒番号  年度    試験ID  国語
  0001    情報太郎      0001      1      0001     5
  0001    情報太郎      0001      1      0002    10

になります。
また、SELECT のところで COUNT, SUM, AVG などの集計関数を用いていないにもかかわらず、GROUP BY が用いられている点も疑わなければなりません。

以上2点の理由からウエについては、はじめからありえません。

イが正しくない理由は「生徒表.生徒番号 = (SELECT 生徒番号 FROM 生徒表)」という文が入っているためです。
実は=(イコール)と副問い合わせを使って比較をする際は、副問い合わせの結果が1行1列でなければならないのです。もし、イコールの右辺の副問い合わせが2行以上になった場合は、エラーが返ってきます。
「SELECT 生徒番号 FROM 生徒表」を実行すると、生徒表に入っているすべての生徒番号が返ってくるため、明らかに1行ではありません。そのため、エラーが返ってきます。

ちなみに本問では「生徒"情報太郎"が複数人いた場合」を考慮しなければなりません。そのため、ウエのSQL分に含まれる「SELECT 生徒番号 FROM 生徒表 WHERE 氏名 = '情報太郎'」も2行以上返ってくる可能性があります。そうなれば、エラーになってしまうためやはりウエは不適なのです。

上記のSQLの決まりごとからイウエはエラーになってしまうため、消去法でアであると答えることが可能です。

復習します。
1. 「FROM 生徒表, 成績表」形式の結合をする際はWHEREで一致する列同士を=で結ばないといけない。
2. 集計関数が使われていないのにGROUP BYが出てくるのはおかしい。
3. =の右辺の副問い合わせは1行1列が返ってこなければならない。
2021.06.26 23:42
かなさん 
FE ブロンズマイスター
(No.3)
なお、結合の方法は「FROM 生徒表, 成績表」だけではありません。
>FROM 生徒表
>JOIN 成績表 ON 生徒表.生徒番号 = 成績表.生徒番号
のようにしても結合できます。
この場合は
>WHERE 生徒表.生徒番号 = 成績表.生徒番号
はいりません。
2021.06.26 23:46
かなさん 
FE ブロンズマイスター
(No.4)
sqlfiddle.com/#!9/843d80/23

上に今回の問題のデータベースとSQL文を組み立ててみたので、色々と動かしてみてください。

イウエの選択肢では、「Subquery returns more than 1 row(副問合せが1行より多く返しています)」というエラーが表示されるはずです。
2021.06.27 19:11
スレ主です。さん 
(No.5)
データベースを実際に動かすとこんなにも円滑に頭に入るのですね。今まで実際にプログラムを動かしたことがなく座学だけですべてを乗り越えてきたので、このような体験するのもとても良い方法だと知りました。

私事ではあるのですが、今回の基本情報で無事合格することができました。質問に回答してくれたかなさんはじめとする方々とこのサイトには感謝します。本当にありがとうございます。
2021.06.27 22:44

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop