A型システムエンジニアの勉強メモ

情報処理試験の午前問題をネタにして、解説をじっくり書きながら勉強しています。基礎は大事。

広告

基本情報技術者試験 平成31年度 春期 午前 問29

SQL 文による表の結合についての問題。

 

--------------------------

基本情報技術者試験

平成31年度 春期 午前 問29

 

"学生" 表と "学部" 表に対して次の SQL 文を実行した結果として、正しいものはどれか。

 

学生

氏名 所属 住所
応用花子 新宿
高度次郎 人文 渋谷
午前桜子 経済 新宿
情報太郎 渋谷

学部

学部名 住所
新宿
経済 渋谷
人文 渋谷
新宿

 

[SQL文]

 SELECT 氏名 FROM 学生、学部 WHERE 所属=学部名 AND 学部.住所='新宿'

 

ア 

氏名
応用花子

 

イ 

氏名
応用花子
午前桜子

 

ウ 

氏名
応用花子
情報太郎

 

エ 

氏名
応用花子
情報太郎
午前桜子

--------------------------

解説

 

 

問題文に表が多いので、解説を書く前にこの時点で書き疲れている。

 

 

FROMの後ろをまず見て、どのような表が作られているかを考えていく。

 FROM 学生、学部

 

2 つの表が FROM で指定されている場合、各々のすべての行の組み合わせが作られると考える。

学生表も学部表も 4 行ずつあるので、4×4 で 16 行ある表がつくられる。

また、属性は各々の表の属性を全て並べたものになる。

学生.氏名 学生.所属 学生.住所 学部.学部名 学部.住所
応用花子 新宿 新宿
応用花子 新宿 経済 渋谷
応用花子 新宿 人文 渋谷
応用花子 新宿 新宿
高度次郎 人文 渋谷 新宿
高度次郎 人文 渋谷 経済 渋谷
高度次郎 人文 渋谷 人文 渋谷
高度次郎 人文 渋谷 新宿
午前桜子 経済 新宿 新宿
午前桜子 経済 新宿 経済 渋谷
午前桜子 経済 新宿 人文 渋谷
午前桜子 経済 新宿 新宿
情報太郎 渋谷 新宿
情報太郎 渋谷 経済 渋谷
情報太郎 渋谷 人文 渋谷
情報太郎 渋谷 新宿

 

属性が "学生.氏名" とあるものは、元は "学生" 表における "氏名" の属性を指している。

このように元の表の名前も付けておかないと、"住所" のように重複していた名称の属性が区別つかなくなってしまう。

 

 

次に進む。

 FROM 学生、学部 WHERE 所属=学部名

WHERE で表示する行を絞り込める。

"所属"と "学部名" は正確に書くと "学生.所属" と "学部.学部名" になる。

が、所属も学部名も名称に重複がなかったので、表の名前部分を省略しても区別がつく。

 

上の 16 行ある表で、学生.所属=学部.学部名 の条件を満たす行だけが残るので、以下のようになる。

学生.氏名 学生.所属 学生.住所 学部.学部名 学部.住所
応用花子 新宿 新宿
高度次郎 人文 渋谷 人文 渋谷
午前桜子 経済 新宿 経済 渋谷
情報太郎 渋谷 新宿

 

 一気に 4 行まで減った。

 

さらに次に進む。

 FROM 学生、学部 WHERE 所属=学部名 AND 学部.住所='新宿'

WHERE の条件に AND が追加されている。

AND なので、"所属=学部名" と "学部.住所='新宿'" の両方の条件を満たす行だけが表示されることになる。

属性 "住所" は表の名前部分を省略してしまうと、学生.住所(学生の住んでいる住所)と学部.住所(学部が設置されている住所)のどちらを指しているかが判断できなくなってしまうため、省略されていない。

 

"所属=学部名" の条件で 4 行まで減った上の表で、条件に AND で"学部.住所='新宿'"を付け足すと以下のようになる。

学生.氏名 学生.所属 学生.住所 学部.学部名 学部.住所
応用花子 新宿 新宿
情報太郎 渋谷 新宿

 

FROM より後ろの部分(FROM 学生、学部 WHERE 所属=学部名 AND 学部.住所='新宿')で作成されている表はこのような形になっている。

 

問題文ではここから "SELECT 氏名" としているので、答えは以下のようになる(氏名の属性名称は重複していないので、表の名前部分は省略できる)。

氏名
応用花子
情報太郎

 

 なので、正解の選択肢はウ

 

 

前後の問題はこちら。