【はびんぐく】
HAVING句 とは?
最終更新:
💡 行を選ぶWHERE、まとめたグループを選ぶHAVING
SQLで、グループごとにまとめた結果を条件で絞り込む句。WHEREが集計前の行を絞るのに対し、HAVINGはCOUNTやSUMなどの集計値で条件を指定できる。
📌 このページのポイント
- WHEREは行、HAVINGは集計したグループを絞る
- COUNTやSUMなどの集計値を条件にできる
- 集計前の行を減らすと、集計結果自体も変わる
- 集計関数だけでなく、GROUP BYの列の条件も書ける
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は「持っている」。条件を満たすグループを残すイメージで覚えると分かりやすいよ。