PostgreSQLのHAVINGでグループに条件を付ける方法
生徒
「GROUP BYで年齢ごとの人数は出せたんですが、人数が多いグループだけを表示することはできますか?」
先生
「できますよ。そのときに使うのがHAVINGです。」
生徒
「WHEREとは違うんですか?」
先生
「WHEREは一行ずつの条件、HAVINGはグループ全体への条件だと考えると分かりやすいです。」
1. SQLとは何か?
SQLは、データベースという「情報を表の形で保存する仕組み」を操作するための言語です。表は、縦に項目、横にデータが並んだ一覧表です。SQLを使うことで、表の中からデータを探したり、数を数えたり、条件に合うものだけを表示したりできます。PostgreSQLは、SQLを使って操作できる代表的なデータベースで、多くの現場で使われています。
2. HAVINGとは何をするものか?
HAVINGは、GROUP BYでまとめた「グループ」に対して条件を付けるためのSQLの書き方です。紙の名簿を年齢ごとに分け、その中で「人数が2人以上の年齢だけを見る」といった作業を想像してください。この「分けたあとに条件を付ける」役割をするのがHAVINGです。
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の基本的な書き方
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の違い
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の組み合わせ
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を使うときの考え方
HAVINGは、「まとめた結果をふるいにかける」ための仕組みです。まずデータを集めて束にし、その束が条件に合うかどうかを見るイメージを持つと理解しやすくなります。PostgreSQLでは、GROUP BYとHAVINGを組み合わせることで、データの特徴や傾向を分かりやすく整理できます。最初はCOUNTと一緒に使う練習から始めると、自然に使い方が身についていきます。