メインコンテンツへ
データベース

次のSQLを実行したとき、結果セットとして正しいものはどれか。テーブル「売上(商品ID, 売上額, 月)」があり、月ごとの売上合計が10000以上の月と、その最大売上額を取得したい。 SELECT 月, MAX(売上額) FROM 売上 GROUP BY 月 HAVING SUM(売上額) >= 10000;

ア.月ごとに全レコードを表示し、その中から売上額が最大のレコードのみ返す
イ.月ごとに集計し、月合計売上が10000以上の月についてその月の最大売上額を返す正解
ウ.全月で売上額の最大値が10000以上のレコードだけ返す
エ.HAVING句でMAX関数を使っていないためエラーになる

解説

SQLの評価順は「FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY」。HAVINGはグループ化後のフィルタ、WHEREは行レベルのフィルタ。グループ集計の番人がHAVING!

なぜ イ が正解か

このSQL: ①GROUP BY 月 → 月ごとのグループを作る。②HAVING SUM(売上額)>=10000 → グループの合計が10000以上のグループだけ残す。③MAX(売上額) → 残ったグループそれぞれで最大売上額を計算。結果: 月合計が10000以上の月の一覧と、各月の最大売上額が返る。HAVINGとSELECTで異なる集計関数を使うことは完全に合法。

なぜ ア は間違いか

「全レコードを表示」はGROUP BYがない場合の動作。GROUP BYで集計されるため個別レコードは表示されない。

なぜ ウ は間違いか

売上額の最大値が10000以上のレコードを返すのはWHERE 売上額>=10000のような行レベルフィルタの挙動。HAVINGはグループ単位で機能する。

なぜ エ は間違いか

HAVING句とSELECT句で使う集計関数は独立しており、異なる関数を使うことは文法的に問題ない。エラーは発生しない。

出典: AI生成問題(学習用)