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 は集計後のグループフィルタです。
3件以上注文したユーザーのみ抽出
クエリを実行してください
カテゴリ別合計価格が100,000円を超えるカテゴリを抽出
クエリを実行してください
平均価格が1,000円以上のカテゴリを抽出
クエリを実行してください
WHERE と HAVING の使い分けが重要
集計関数(COUNT・SUM など)を条件に使いたい場合は HAVING。集計前の列で絞り込む場合は WHERE の方が効率的。
WHERE と HAVING の併用が可能
WHERE で先に行を絞り込んでから GROUP BY・HAVING で集計・フィルタリングすると効率が上がる。
HAVING は GROUP BY なしでも使えるが実用的でない
GROUP BY なしの場合はテーブル全体が1グループとして扱われる。通常は GROUP BY とセットで使う。
- N件以上購入した顧客を抽出するとき
- 合計売上が一定以上のカテゴリを絞り込むとき
- 平均評価が高い商品グループを抽出するとき
- グループ集計後にランキング条件をかけるとき
#36 ユーザー別購入数量
各ユーザーの購入合計数量を求め、数量が2以上のユーザーに絞って表示してください。