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

SQLのHAVING句を使ったデータの絞り込みと集計のイメージ
HAVING句を使えば、SQLで集計後のデータを条件付きで絞り込むことができます。

SQLでデータを集計するときに欠かせないのが GROUP BY句 ですが、さらに集計後の結果を絞り込みたい場合に使うのが HAVING句 です。
本記事では、HAVING句の基本から実用的な使い方までを解説します。

HAVING句とは?

通常、データを絞り込むには WHERE句 を使います。しかし、WHERE句は「集計前の行」に対して条件を指定するものです。
一方、HAVING句は「集計後のグループ」に対して条件を指定するために使います。

つまり、

  • WHERE句:集計前の行を絞り込みたいときに使用
  • HAVING句:集計後の結果を絞り込みたいときに使用

という使い分けが必要です。

HAVING句の基本構文

SELECT カラム名, 集計関数
FROM テーブル名
GROUP BY カラム名
HAVING 条件;

例:売上テーブルでの活用

例えば、次のような売上データ(salesテーブル)があるとします。

id商品名数量金額
1りんご5500
2みかん3300
3りんご2200
4ぶどう101000
5みかん7700

このデータを「商品ごとの合計金額」で集計し、さらに「合計金額が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句を使うときの注意点

  1. HAVING句は GROUP BY句の後に書く 必要がある
  2. 集計関数を使わずにHAVING句を記述することも可能(ただし一般的ではない)
  3. 集計の条件指定をWHEREでできる場合は、WHEREを優先したほうが効率がよい

まとめ

  • HAVING句は集計後の結果を絞り込むために使う
  • WHERE句とは役割が異なる(WHERE=集計前、HAVING=集計後)
  • COUNT, SUM, AVGなどの集計関数と組み合わせて活用する

HAVING句を正しく使えるようになると、SQLでのデータ分析がぐっと便利になります。

関連記事