基本情報技術者 2019年 春期 午前(科目A) 問29
問題文
“学生”表と“学部”表に対して次のSQL文を実行した結果として、正しいものはどれか。


選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
SQLの結合と集約処理【午前解説】
正解の理由
SQL は学生表と学部表を組み合わせ(カンマは旧式のクロス結合+絞り込み)、WHERE 節で所属=学部名 かつ 学部.住所 = '新宿' を指定しています。
学部表で住所が '新宿' の学部は「工」と「理」です。これと所属が一致する学生は「応用花子(所属=理)」と「情報太郎(所属=工)」だけなので、氏名としてその2名が返ります。よって選択肢の中では ウ が正しい答えです。
学部表で住所が '新宿' の学部は「工」と「理」です。これと所属が一致する学生は「応用花子(所属=理)」と「情報太郎(所属=工)」だけなので、氏名としてその2名が返ります。よって選択肢の中では ウ が正しい答えです。
解法ステップ
- SQL を読み、FROM に学生, 学部 とあることから両テーブルの組み合わせを考える。
- WHERE の学部.住所 = '新宿' で学部表を絞り、「工」「理」が残ることを確認する。
- さらに所属 = 学部名 を満たす学生を探すと、所属が「工」「理」の学生が該当する。
- SELECT 氏名 なので、該当学生の氏名のみを抽出し、応用花子と情報太郎になることを答える。
選択肢別の誤答解説
- ア:応用花子のみ
誤り。理(応用花子)に加えて工(情報太郎)も学部.住所='新宿' のため該当します。 - イ:応用花子、午前桜子
誤り。午前桜子は所属が経済ですが、経済学部の住所は渋谷であり、学部.住所='新宿' を満たしません。 - ウ:応用花子、情報太郎
正解。学部.住所='新宿' の学部は「工」「理」で、それに対応する学生が該当します。 - エ:応用花子、情報太郎、午前桜子
誤り。午前桜子(所属=経済)は学部.住所 が渋谷なので除外されます。
よくある誤解
- 学生.住所 = '新宿' と誤解する:条件は学部.住所 なので、学生の住所が新宿かどうかは結果に影響しません。
- FROM のカンマを見て「全件結合だ」とだけ考える:カンマ結合でも WHERE によって内部結合と同じ効果になる点を理解していないと誤答します。
- 出力順序を固定と考える:ORDER BY がない場合、行の並びはDB実装によるため確約されません(ただし問題の選択肢は想定順で正答を示しています)。
補足コラム
- カンマ区切りの FROM は古い書き方で、可読性と意図の明確化のためには INNER JOIN を使い、結合条件は ON に書くことを推奨します。
例:SELECT 氏名 FROM 学生 INNER JOIN 学部 ON 学生.所属 = 学部.学部名 WHERE 学部.住所 = '新宿'; - 同名カラムが両テーブルにある場合は必ずテーブル名またはエイリアスで修飾して曖昧さを避けましょう。
- ORDER BY を付けなければ行順は保証されないので、出力順が問題に影響する場合は必ず指定すること。
FAQ
Q1. WHERE に学部.住所 と書かれているが、学部名と住所の対応はどう探せば良い?
A1. 学部表を先にフィルタリング(学部.住所='新宿')して対象学部名の集合を把握し、それと学生の所属を突き合わせます。図表を使って手作業で確認すると早いです。
A1. 学部表を先にフィルタリング(学部.住所='新宿')して対象学部名の集合を把握し、それと学生の所属を突き合わせます。図表を使って手作業で確認すると早いです。
Q2. FROM が「学生, 学部」で INNER JOIN と同じと考えて良いですか?
A2. WHERE に結合条件がある限り内部結合と同じ結果になりますが、可読性・保守性の観点からは INNER JOIN … ON … を使うのが現代的です。
A2. WHERE に結合条件がある限り内部結合と同じ結果になりますが、可読性・保守性の観点からは INNER JOIN … ON … を使うのが現代的です。
Q3. 同じ学部名が学部表に複数行あった場合はどうなる?
A3. 学部表の該当行ごとに学生行が複数回結合され、重複した氏名が結果に現れる可能性があります。重複を避けるには DISTINCT を使うか学部表を正規化します。
A3. 学部表の該当行ごとに学生行が複数回結合され、重複した氏名が結果に現れる可能性があります。重複を避けるには DISTINCT を使うか学部表を正規化します。
関連キーワード: SQL、SELECT、WHERE、JOIN、INNER JOIN、カンマ結合、テーブル結合、列修飾、DISTINCT、ORDER BY、結合条件、カラム名の曖昧さ

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

