SQLでデータを絞り込むHAVING句の解説

SQLでデータを集計するときに欠かせないのが GROUP BY句 ですが、さらに集計後の結果を絞り込みたい場合に使うのが HAVING句 です。
本記事では、HAVING句の基本から実用的な使い方までを解説します。
Contents
HAVING句とは?
通常、データを絞り込むには WHERE句 を使います。しかし、WHERE句は「集計前の行」に対して条件を指定するものです。
一方、HAVING句は「集計後のグループ」に対して条件を指定するために使います。
つまり、
- WHERE句:集計前の行を絞り込みたいときに使用
- HAVING句:集計後の結果を絞り込みたいときに使用
という使い分けが必要です。
HAVING句の基本構文
SELECT カラム名, 集計関数
FROM テーブル名
GROUP BY カラム名
HAVING 条件;例:売上テーブルでの活用
例えば、次のような売上データ(salesテーブル)があるとします。
| id | 商品名 | 数量 | 金額 |
|---|---|---|---|
| 1 | りんご | 5 | 500 |
| 2 | みかん | 3 | 300 |
| 3 | りんご | 2 | 200 |
| 4 | ぶどう | 10 | 1000 |
| 5 | みかん | 7 | 700 |
このデータを「商品ごとの合計金額」で集計し、さらに「合計金額が500円以上の商品だけ」を抽出する場合、HAVING句を使います。
SELECT 商品名, SUM(金額) AS 合計金額
FROM sales
GROUP BY 商品名
HAVING SUM(金額) >= 500;実行結果
| 商品名 | 合計金額 |
|---|---|
| りんご | 700 |
| みかん | 1000 |
| ぶどう | 1000 |
このように、HAVING句を使うことで「集計後の条件指定」が可能になります。
WHERE句とHAVING句の違い
同じ「絞り込み」でも、WHERE句とHAVING句では使えるタイミングが異なります。
- WHERE句
→ 集計前の行を制限する。
SELECT 商品名, SUM(金額)
FROM sales
WHERE 金額 >= 500
GROUP BY 商品名;(金額500円未満のレコードを集計前に除外)
- HAVING句
→ 集計後の結果を制限する。
SELECT 商品名, SUM(金額)
FROM sales
GROUP BY 商品名
HAVING SUM(金額) >= 500;(集計結果をさらに絞り込み)
状況に応じて使い分けることが重要です。
HAVING句でよく使う集計関数
HAVING句では以下の集計関数と組み合わせることが多いです。
COUNT():グループ内の件数SUM():合計AVG():平均MAX():最大値MIN():最小値
例:注文数が2件以上の商品を抽出
SELECT 商品名, COUNT(*) AS 注文数
FROM sales
GROUP BY 商品名
HAVING COUNT(*) >= 2;HAVING句を使うときの注意点
- HAVING句は GROUP BY句の後に書く 必要がある
- 集計関数を使わずにHAVING句を記述することも可能(ただし一般的ではない)
- 集計の条件指定をWHEREでできる場合は、WHEREを優先したほうが効率がよい
まとめ
- HAVING句は集計後の結果を絞り込むために使う
- WHERE句とは役割が異なる(WHERE=集計前、HAVING=集計後)
- COUNT, SUM, AVGなどの集計関数と組み合わせて活用する
HAVING句を正しく使えるようになると、SQLでのデータ分析がぐっと便利になります。

