一人前エンジニア道場

データベース設計 / 約20分

GROUP BY応用: HAVING で集計後に絞り込む

なぜこれを学ぶか

「カテゴリ別の平均価格が1000円以上のカテゴリだけ」——これは集計「後」の絞り込みで、HAVINGが必要です。COUNT以外の集計関数をHAVINGで使うパターンを習得しましょう。

HAVING は GROUP BY でグループ化した後の集計結果に条件を付けます。WHERE が「グループ化前」、HAVING が「グループ化後」と明確に区別して覚えましょう。

HAVING AVG(price) >= 1000 のように、AVG・SUM・MAXなど任意の集計関数を条件に使えます。WHERE AVG(price) >= 1000 はエラーになります。

SELECT 節で集計列に 別名(AS) を付けると、ORDER BY でその別名が使えます: SELECT AVG(price) AS avg_price ... ORDER BY avg_price DESC。ただし SQLite では HAVING 節でも別名が使えますが、他のDBでは使えないことがあります。

複数の集計関数を同時に取得できます: SELECT category, COUNT(*) AS cnt, AVG(price) AS avg のように1クエリで複数の集計値を出力できます。

重要ポイント

  • HAVING は GROUP BY 後の集計結果を絞る(WHERE は集計前)
  • AVG・SUM・MAX などどの集計関数でも HAVING に書ける
  • 集計列に AS で別名を付けると ORDER BY で使いやすくなる

理解度チェック

選ぶと即座に解説が表示されます。

カテゴリ別の件数を取得し、「件数が3以上のカテゴリ」だけ出すSQLの正しい書き方は?

ヒントを見る

「件数が3以上」という条件は、グループ化の前と後どちらの絞り込みでしょうか?

SQL演習ブラウザ内SQLite

products テーブルから「カテゴリ別の商品数と平均価格」を、平均価格1000円以上のカテゴリのみ、平均価格の高い順で取得してください。列は category, item_count(商品数), avg_price(平均価格)です。

テーブル定義と初期データを見る
CREATE TABLE products (id INTEGER PRIMARY KEY, category TEXT, price INTEGER);
INSERT INTO products VALUES
  (1, 'food', 150), (2, 'food', 1200), (3, 'food', 800),
  (4, 'electronics', 89800), (5, 'electronics', 2980), (6, 'electronics', 5500),
  (7, 'book', 1500), (8, 'book', 2000);

スキルセルフチェック

このレッスンの内容をどの程度理解できましたか?