GROUP BYとHAVINGとは?ぐるーぷばいとはびんぐ
GROUP BYとHAVINGとは、集計のための2つの句。GROUP BYは指定した列の値が同じ行を1つのグループへまとめ、COUNTやSUMをグループごとに計算させる。HAVINGはできあがったグループを絞り込む条件を書く場所で、行そのものを絞るWHEREとは効く段階が違う。
最終更新:2026-10-06
この語が出る過去問を解く →背景
集約の前と後では、条件に使える値が違う。行を1件ずつ見ている段階では合計値がまだ存在せず、合計が出た段階では個々の行が失われている。この二段階のどちらで絞るのかを書き分けられるように、WHEREとは別の句が用意されている。運用では、SLA報告や稼働統計を自分でデータベースから取り出す場面でこの使い分けが効く。
具体例
「月間の障害件数が5件を超えた業務システム」を出すなら、システムコードで GROUP BY し、HAVING COUNT(*) > 5 と書く。対象月の限定は行単位の条件なので WHERE で先に絞ると、集約する行数が減って月次レポートの所要時間も短くなる。
試験での引っ掛け
HAVINGはWHEREの置き換えではない。行単位で絞れる条件までHAVINGに寄せると集約対象が減らず、件数が増えたときに処理時間が伸びる。GROUP BYに挙げていない列を選択列へ書けるかは製品ごとに違うため、運用スクリプトを別の製品へ移すときは必ず確認する。
関連用語
出た過去問
出典:平成30年度 秋期 ITサービスマネージャ試験 午前Ⅱ 問21(IPA)
“社員”表から、役割名がプログラマである社員が3人以上所属している部門の部門名を取得するSQL文はどれか。ここで、実線の下線は主キーを表す。 社員(社員番号, …
正解:SELECT 部門名 FROM 社員 WHERE 役割名 = 'プログラマ' GROUP BY 部門名 HAVING COUNT(*) >= 3
要点:行の条件はWHERE、集約後の条件はHAVINGに書く
SQLの評価順は、WHEREで行を絞り込み、GROUP BYで集約し、HAVINGで集約結果を絞り込む、という順序になる。したがって役割名の条件は行単位なのでWHEREに、人数3人以上という集約後の条件はHAVING COUNT(*)>=3に書く必要がある。集約関数をWHEREに書くことはできず、HAVINGをWHEREより前に置くこともできない。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。