戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 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 を使います。

解法ステップ

  1. SELECT 句を見て、集約関数(AVG, SUM など)が使われているか確認する。
  2. 非集約で列が混在している場合、その列が GROUP BY に含まれているかを確認する。
  3. 集約関数が入れ子(AVG(SUM(...)) 等)になっていないか、また WHERE で集約を参照していないかを確認する。
  4. 以上のルールを満たす選択肢を正解とする(イが該当)。

選択肢別の誤答解説

  • ア: 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 によるグループの絞り込みが行われます。
Q: AVG(SUM(...)) のような入れ子は絶対に使えませんか?
A: 直接入れ子にすることはできませんが、サブクエリで一度集計してから外側で AVG を取ることで同等の処理が可能です。

関連キーワード: SQL、GROUP BY、HAVING、集約関数、AVG、SUM、SELECT句、WHERE句
← 前の問題へ次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について