【はびんぐく】

HAVING句 とは?

💡 グループにまとめた後でふるいにかける!集計結果の門番
📌 このページのポイント
WHERE句 と HAVING句 の違い 元データ 東京 田中 80万 東京 佐藤 60万 大阪 山田 90万 東京 鈴木 40万 福岡 伊藤 70万 WHERE 行をフィルタ 東京 田中 80万 東京 佐藤 60万 東京 鈴木 40万 GROUP BY グループ化 東京: 3人 合計 180万 HAVING 集計フィルタ COUNT(*) >= 2 ? ✓ 通過! SQL実行順序 FROM WHERE GROUP BY HAVING SELECT WHERE = 行のフィルタ(GROUP BY前) HAVING = グループのフィルタ(GROUP BY後)
HAVING句のイメージ
ひよこ ひよこ

HAVING句って、WHERE句と何が違うの?

ペンギン先生 ペンギン先生

WHERE句は「グループ化する前の個々の行」をフィルタするけど、HAVING句は「GROUP BYでまとめた後の集計結果」をフィルタするんだよ。実行タイミングが違うんだ

ひよこ ひよこ

具体的な例で教えてほしいな!

ペンギン先生 ペンギン先生

たとえば「各部署の社員数が5人以上の部署だけ表示したい」場合、SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) >= 5 と書くんだ。COUNTの結果でフィルタするからHAVINGを使うんだよ

ひよこ ひよこ

WHEREでCOUNTを使っちゃダメなの?

ペンギン先生 ペンギン先生

WHERE句では集計関数は使えないんだ。WHEREが実行される時点ではまだグループ化されてないからね。SQLの実行順序はFROM → WHERE → GROUP BY → HAVING → SELECTという順番だよ

ひよこ ひよこ

WHEREとHAVINGを両方使うこともあるの?

ペンギン先生 ペンギン先生

もちろん!たとえば「東京の部署だけを対象に(WHERE)、社員数が5人以上の部署を取得(HAVING)」みたいに組み合わせるんだ。先にWHEREで行を絞った方がパフォーマンスがいいよ

ひよこ ひよこ

HAVING句で気をつけることってある?

ペンギン先生 ペンギン先生

HAVINGで書ける条件をWHEREに移せるなら移した方がいいよ。GROUP BY前に行数を減らせるからパフォーマンスが上がるんだ。HAVINGは集計関数を使った条件のときだけ使うのがベストプラクティスだね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「HAVING句」って出てきたら「GROUP BYした後の集計結果にフィルタをかける句」と思えればだいたいOK!
📖 おまけ:英語の意味
「HAVING Clause」 = HAVING句
💬 英語のhaving(持っている)から来ていて、「こういう条件を持っているグループだけ」という意味合いだよ
← 用語集にもどる