基本情報技術者試験 平成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 氏名" としているので、答えは以下のようになる(氏名の属性名称は重複していないので、表の名前部分は省略できる)。
氏名 |
---|
応用花子 |
情報太郎 |
なので、正解の選択肢はウ。
前後の問題はこちら。