基本情報技術者 2009年 秋期 午前(科目A) 問33
問題文
SQLの構文として、正しいものはどれか。
選択肢
ア:SELECT 注文日, AVG(数量) FROM 注文明細
イ:SELECT 注文日, AVG(数量) FROM 注文明細 GROUP BY 注文日(正解)
ウ:SELECT 注文日, AVG(SUM(数量)) FROM 注文明細 GROUP BY 注文日
エ:SELECT 注文日 FROM 注文明細 WHERE SUM(数量) > 1000 GROUP BY 注文日
##: SQLの構文として、正しいものはどれか【午前2 解説】
要点まとめ
- 結論:SELECT に集約関数と非集約列が混在する場合は GROUP BY が必須で、選択肢の中では イ が正しい構文です。
- 根拠:SQL 標準では SELECT 句にある非集約列は GROUP BY に含めるか集約関数で囲む必要があり、イはこのルールに従っています。
- 差がつくポイント:WHERE と HAVING の使い分けや集約関数の入れ子の可否、GROUP BY の粒度を正しく理解することが合否を左右します。
正解の理由
イ は SELECT に非集約列(注文日)と集約関数 AVG(数量) を含んでいますが、GROUP BY 注文日 を指定しているため、SQL の規則「非集約列は GROUP BY に含める」 に従っています。これにより各注文日ごとの数量の平均を正しく算出できます。
よくある誤解
- 集約関数を使えば GROUP BY は不要と考える誤解が多いですが、非集約列がある場合は必須です。
- WHERE 句で集約条件を書くことはできず、集約結果に対する条件は HAVING を使います。
解法ステップ
- SELECT 句を見て、集約関数(AVG, SUM など)が使われているか確認する。
- 非集約で列が混在している場合、その列が GROUP BY に含まれているかを確認する。
- 集約関数が入れ子(AVG(SUM(...)) 等)になっていないか、また WHERE で集約を参照していないかを確認する。
- 以上のルールを満たす選択肢を正解とする(イが該当)。
選択肢別の誤答解説
- ア: SELECT 注文日, AVG(数量) FROM 注文明細
- 誤り:非集約列(注文日)を GROUP BY に含めていないため、SQL 標準ではエラーになります。
- イ: SELECT 注文日, AVG(数量) FROM 注文明細 GROUP BY 注文日
- 正解:非集約列を GROUP BY に含め、各注文日ごとの数量平均を求める正しい構文です。
- ウ: SELECT 注文日, AVG(SUM(数量)) FROM 注文明細 GROUP BY 注文日
- 誤り:集約関数の入れ子は通常の SQL では許されません。SUM の結果に対して AVG を直接取るにはサブクエリが必要です。
- エ: SELECT 注文日 FROM 注文明細 WHERE SUM(数量) > 1000 GROUP BY 注文日
- 誤り:WHERE 句では集約関数を使えません。集計後の条件は HAVING を使う必要があります。
補足コラム
- WHERE と HAVING の違い:WHERE は行選択(グループ化前)に使い、HAVING はグループ化後の集約結果に条件を付けるために使います。
- 入れ子の集約を行いたい場合はサブクエリを使う例:
-- 各注文日の合計を出して、その平均を取得する(全体の平均を例示) SELECT AVG(total_qty) AS avg_per_day FROM ( SELECT 注文日, SUM(数量) AS total_qty FROM 注文明細 GROUP BY 注文日 ) t;
- SQL の実装差:一部のデータベースは拡張構文を持つ場合がありますが、試験では標準仕様に基づいた理解を重視してください。
FAQ
Q: WHERE と HAVING はどちらを先に評価しますか?
A: WHERE が先に評価され(行ごとの選別)、その後 GROUP BY、最後に HAVING によるグループの絞り込みが行われます。
A: WHERE が先に評価され(行ごとの選別)、その後 GROUP BY、最後に HAVING によるグループの絞り込みが行われます。
Q: AVG(SUM(...)) のような入れ子は絶対に使えませんか?
A: 直接入れ子にすることはできませんが、サブクエリで一度集計してから外側で AVG を取ることで同等の処理が可能です。
A: 直接入れ子にすることはできませんが、サブクエリで一度集計してから外側で AVG を取ることで同等の処理が可能です。
関連キーワード: SQL、GROUP BY、HAVING、集約関数、AVG、SUM、SELECT句、WHERE句

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

