カテゴリ: PostgreSQL 更新日: 2026/01/18

PostgreSQLのHAVINGでグループに条件を付ける方法

PostgreSQLのHAVINGでグループに条件を付ける方法
PostgreSQLのHAVINGでグループに条件を付ける方法

先生と生徒の会話形式で理解しよう

生徒

「GROUP BYで年齢ごとの人数は出せたんですが、人数が多いグループだけを表示することはできますか?」

先生

「できますよ。そのときに使うのがHAVINGです。」

生徒

「WHEREとは違うんですか?」

先生

「WHEREは一行ずつの条件、HAVINGはグループ全体への条件だと考えると分かりやすいです。」

1. SQLとは何か?

1. SQLとは何か?
1. SQLとは何か?

SQLは、データベースという「情報を表の形で保存する仕組み」を操作するための言語です。表は、縦に項目、横にデータが並んだ一覧表です。SQLを使うことで、表の中からデータを探したり、数を数えたり、条件に合うものだけを表示したりできます。PostgreSQLは、SQLを使って操作できる代表的なデータベースで、多くの現場で使われています。

2. HAVINGとは何をするものか?

2. HAVINGとは何をするものか?
2. HAVINGとは何をするものか?

HAVINGは、GROUP BYでまとめた「グループ」に対して条件を付けるためのSQLの書き方です。紙の名簿を年齢ごとに分け、その中で「人数が2人以上の年齢だけを見る」といった作業を想像してください。この「分けたあとに条件を付ける」役割をするのがHAVINGです。

3. サンプルテーブルを確認しよう

3. サンプルテーブルを確認しよう
3. サンプルテーブルを確認しよう

ここではusersテーブルを使って説明します。SQLを実行する前のテーブルは次のとおりです。


id | name       | age | email
---+------------+-----+-------------------
1  | 山田太郎   | 25  | taro@example.com
2  | 佐藤花子   | 19  | hanako@example.com
3  | 鈴木一郎   | 30  | ichiro@example.com
4  | 高橋次郎   | 25  | jiro@example.com
5  | 伊藤美咲   | 19  | misaki@example.com
6  | 小林健太   | 30  | kenta@example.com
7  | 中村彩     | 25  | aya@example.com

4. HAVINGの基本的な書き方

4. HAVINGの基本的な書き方
4. HAVINGの基本的な書き方

HAVINGは、GROUP BYの後に書きます。例えば、年齢ごとに人数を数え、その人数が2人以上のグループだけを表示する場合は次のように書きます。


SELECT age, COUNT(*)
FROM users
GROUP BY age
HAVING COUNT(*) >= 2;

age | count
----+------
19  | 2
25  | 3
30  | 2

この結果は、同じ年齢の人が2人以上いる年齢だけが表示されています。GROUP BYでまとめたあと、その結果に対して条件を付けている点が重要です。

5. WHEREとHAVINGの違い

5. WHEREとHAVINGの違い
5. WHEREとHAVINGの違い

WHEREとHAVINGは似ていますが、役割が違います。WHEREは、表の一行一行に対して条件を付けます。一方、HAVINGは、GROUP BYでできたグループ全体に条件を付けます。例えば、「20歳以上の人だけを対象にして、年齢ごとの人数が2人以上のものを見る」場合は、WHEREとHAVINGを組み合わせます。


SELECT age, COUNT(*)
FROM users
WHERE age >= 20
GROUP BY age
HAVING COUNT(*) >= 2;

age | count
----+------
25  | 3
30  | 2

まずWHEREで対象を絞り、そのあとGROUP BYでまとめ、最後にHAVINGで条件を付ける、という流れになります。

6. 集約関数とHAVINGの組み合わせ

6. 集約関数とHAVINGの組み合わせ
6. 集約関数とHAVINGの組み合わせ

HAVINGでは、COUNTだけでなく、AVGやSUMなどの集約関数も使えます。例えば、年齢ごとの平均年齢が25以上のグループだけを表示する場合です。


SELECT age, AVG(age)
FROM users
GROUP BY age
HAVING AVG(age) >= 25;

age | avg
----+-----
25  | 25
30  | 30

このように、グループ全体の計算結果に対して条件を付けられるのがHAVINGの特徴です。

7. HAVINGを使うときの考え方

7. HAVINGを使うときの考え方
7. HAVINGを使うときの考え方

HAVINGは、「まとめた結果をふるいにかける」ための仕組みです。まずデータを集めて束にし、その束が条件に合うかどうかを見るイメージを持つと理解しやすくなります。PostgreSQLでは、GROUP BYとHAVINGを組み合わせることで、データの特徴や傾向を分かりやすく整理できます。最初はCOUNTと一緒に使う練習から始めると、自然に使い方が身についていきます。

カテゴリの一覧へ
新着記事
New1
PostgreSQL
PostgreSQLのLIMIT・OFFSETとパフォーマンス問題を完全解説|初心者でもわかる安全な使い方
New2
MySQL
MySQLのUPDATE文でデータを更新する基本を徹底解説|SQL初心者でもわかるデータベース更新入門
New3
PostgreSQL
PostgreSQLのOFFSET完全入門|並び替えと組み合わせてデータをスキップする方法を初心者向けに解説
New4
MySQL
MySQLで複数行INSERTを行う方法と注意点を徹底解説|SQL基礎から学ぶデータベース入門
人気記事
No.1
Java&Spring記事人気No1
PostgreSQL
PostgreSQLのDISTINCT完全ガイド|SQLで重複データを除外する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
PostgreSQL
PostgreSQLの主キー・外部キーを完全解説!初心者でもわかる設定方法と考え方
No.3
Java&Spring記事人気No3
PostgreSQL
PostgreSQLのLEFT JOIN完全入門!不足データを補いながらテーブル結合する仕組みをやさしく解説
No.4
Java&Spring記事人気No4
PostgreSQL
PostgreSQLとは?初心者向けに特徴をわかりやすく解説
No.5
Java&Spring記事人気No5
PostgreSQL
PostgreSQLのUPDATE文の使い方(部分更新・条件更新)
No.6
Java&Spring記事人気No6
PostgreSQL
PostgreSQLスキーマ設計のベストプラクティス完全ガイド|初心者でもわかるデータベース整理術
No.7
Java&Spring記事人気No7
PostgreSQL
PostgreSQLスキーマ作成・削除完全ガイド!初心者でもわかるデータベース設計の基礎
No.8
Java&Spring記事人気No8
PostgreSQL
PostgreSQLのWHERE句を完全解説|初心者でもわかる条件指定の基本と使い方