GROUP BYとHAVINGとは?ぐるーぷばいとはびんぐ
GROUP BYは指定した列の値ごとに行をまとめる句で、COUNTやSUMなどの集約関数はまとめたグループ単位で計算される。HAVINGはまとめた後のグループに条件を掛ける句。行を1件ずつ判定するWHEREに対し、HAVINGは集約した結果そのものを条件にできる点が違う。
最終更新:2026-10-06
この語が出る過去問を解く →背景
集計は「絞ってからまとめる」のか「まとめてから絞る」のかで結果が変わるため、SQLは条件を書く場所を2つに分けている。WHEREは結合と集約より前、HAVINGは集約より後に評価されるという実行順序が、そのまま使い分けの根拠になる。結果の正しさと処理量の両方がここで決まる。
具体例
「月間受注が100万円を超えた得意先」なら、得意先コードでGROUP BYし、HAVING SUM(金額) > 1000000 と書く。対象月の限定は行単位で判定できる条件なのでWHEREへ置き、集約に回る行数を先に減らしておく。
試験での引っ掛け
HAVINGはWHEREの代用ではない。行単位で判定できる条件までHAVINGへ書くと、集約対象の行数が減らないため処理量が落ちない。GROUP BYに含めない列を選択列に書けないという制約も、実装によって扱いが違うので設計時に確かめる。
関連用語
出た過去問
出典:令和3年度 春期 システムアーキテクト試験 午前Ⅱ 問24(IPA)
ある月の“月末商品在庫”表と“当月商品出荷実績”表を使って、ビュー“商品別出荷実績”を定義した。このビューにSQL文を実行した結果の値はどれか。 [ビュー“商品…
正解:400
要点:NULLは比較で真にならず、WHERE句の対象から外れる
ビューは外部結合と集約により、商品コードごとの出荷数合計と在庫数を返す。出荷実績のないS002とS004は合計がNULLとなり、WHERE句の比較で真とならず除外される。条件を満たすのは合計150のS001(在庫100)と合計300のS003(在庫300)で、在庫数の合計は400となる。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。