HAVING

HAVING句についての詳細な解説と使用例。GROUP BY後の集計結果を絞り込む方法を学べます。

SQLのHAVING句の使い方をCOUNTで確認する

ユーザーごとの注文件数など、集計値でグループを絞り込むときにHAVING句を使います。 GROUP BYの後に、COUNTやSUMなどを使った条件を書きます。

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 3;

GROUP BYでuser_idごとにまとめ、COUNT(*)で各ユーザーの注文行数を数えます。 HAVING COUNT(*) >= 3は、3件以上のグループだけを残す条件です。 COUNT(列名)はその列のNULLを数えないため、行数を求めるCOUNT(*)とは結果が異なる場合があります。

WHEREとHAVINGの違いと併用

WHEREは集計対象の行を絞り込み、HAVINGは集計後のグループに条件を付けます。 たとえば数量が2以上の注文を対象に、3件以上注文したユーザーを調べる場合は次のように書きます。

SELECT user_id, COUNT(*) AS order_count
FROM orders
WHERE quantity >= 2
GROUP BY user_id
HAVING COUNT(*) >= 3;

この件数はWHEREを満たす注文だけを数えた値です。 集計前の条件を変えると、HAVINGで残るユーザーも変わります。GROUP BYの解説と、画面下のSUMやAVGの例文でも確認できます。

説明

HAVING は GROUP BY でグループ化・集計した結果に対して条件を指定するための句です。
WHERE が集計前の行フィルタであるのに対し、HAVING は集計後のグループフィルタです。

基本構文
quest.sql
Loading...
例文

3件以上注文したユーザーのみ抽出

quest.sql
Loading...
— RESULT

クエリを実行してください

カテゴリ別合計価格が100,000円を超えるカテゴリを抽出

quest.sql
Loading...
— RESULT

クエリを実行してください

平均価格が1,000円以上のカテゴリを抽出

quest.sql
Loading...
— RESULT

クエリを実行してください

注意点
  • WHERE と HAVING の使い分けが重要

    集計関数(COUNT・SUM など)を条件に使いたい場合は HAVING。集計前の列で絞り込む場合は WHERE の方が効率的。

  • WHERE と HAVING の併用が可能

    WHERE で先に行を絞り込んでから GROUP BY・HAVING で集計・フィルタリングすると効率が上がる。

  • HAVING は GROUP BY なしでも使えるが実用的でない

    GROUP BY なしの場合はテーブル全体が1グループとして扱われる。通常は GROUP BY とセットで使う。

使用シーン
  • N件以上購入した顧客を抽出するとき
  • 合計売上が一定以上のカテゴリを絞り込むとき
  • 平均評価が高い商品グループを抽出するとき
  • グループ集計後にランキング条件をかけるとき
このクエリを実践するには?

#36 ユーザー別購入数量

中級JOIN + 集計ログインして解除

各ユーザーの購入合計数量を求め、数量が2以上のユーザーに絞って表示してください。

関連クエリ