【はびんぐく】

HAVING句 とは?

最終更新:
💡 行を選ぶWHERE、まとめたグループを選ぶHAVING

SQLで、グループごとにまとめた結果を条件で絞り込む句。WHEREが集計前の行を絞るのに対し、HAVINGはCOUNTやSUMなどの集計値で条件を指定できる。

📌 このページのポイント
WHEREは行、HAVINGはグループ例:東京の社員を部署ごとに数える① 元の行東京・A:3人東京・B:1人大阪・B:1人勤務地と部署を持つ② WHERE勤務地=東京Aの行が3件Bの行が1件大阪の行は除く③ GROUP BY部署A:3人部署B:1人COUNT(*)で数える④ HAVING人数が3人以上✓ 部署A:3人部署Bは結果に残らない集計前に選ぶ行が、集計値にも影響する
論理的な処理の流れの例です。DB内部の実行順序を固定する図ではありません。
ひよこ ひよこ
HAVING句は、WHERE句と何が違うの?
ペンギン先生 ペンギン先生
WHEREは集計前の個々の行を絞り、HAVINGはグループとしてまとめた結果を絞るよ。例えば「社員数が5人以上の部署」を選びたいなら、部署ごとのCOUNT(*)をHAVINGで確認するんだ。
ひよこ ひよこ
SQLでは、どう書くの?
ペンギン先生 ペンギン先生
例えばSELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) >= 5だよ。部署ごとに人数を数え、その人数が5以上の部署だけを結果に残す。図では、人数が3人以上という小さな例で見てみよう。
ひよこ ひよこ
WHERE COUNT(*) >= 5では、だめなの?
ペンギン先生 ペンギン先生
同じ段階で集計するCOUNT(*)を、そのWHERE条件には書けないよ。WHEREの行の絞り込みをしてから集計する、という論理的な順序で考えるんだ。これは実際のDBの内部処理が必ずその順番に走るという意味ではないよ。
ひよこ ひよこ
WHEREとHAVINGを、一緒に使える?
ペンギン先生 ペンギン先生
使えるよ。WHERE location = '東京'で社員の行を選び、部署ごとに数え、HAVING COUNT(*) >= 5で人数の多い部署を残す。ただし、この人数は東京にいる社員だけの人数。WHEREで集計前に何を除くかによって、COUNTやSUMの値も変わるんだ。
ひよこ ひよこ
HAVINGは、集計関数の条件にしか使えない?
ペンギン先生 ペンギン先生
GROUP BYでまとめる列の条件も書けるよ。さらにPostgreSQLでは、GROUP BYなしでも全体を1グループとしてHAVINGで絞る場合がある。行だけの条件はWHERE、集計結果の条件はHAVINGと区別すると分かりやすい。条件を移すなら、結果が同じになるかを先に確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「HAVING句」って出てきたら「集計したグループを条件で絞り込むSQLの句」と思えばだいたいOK!
📖 おまけ:英語の意味
「HAVING Clause」 = HAVINGというキーワードを使う句
💬 英語のhavingは「持っている」。条件を満たすグループを残すイメージで覚えると分かりやすいよ。

参考資料

← 用語集にもどる