HAVINGとは?SQL初心者向けに基本から使い方までわかりやすく解説
HAVING(ハビング)とは、GROUP BYでグループ化した後の集計結果に対して条件を指定するSQLの機能です。
「部署ごとの社員数が10人以上の部署だけ表示したい」「商品ごとの売上合計が100万円以上の商品だけ取得したい」といった集計結果を絞り込む場合に使用します。
HAVINGとは?
HAVINGは、SQL(Structured Query Language)の条件指定機能の一つです。
WHERE句がグループ化する前のデータを絞り込むのに対し、HAVINGはGROUP BYで集計した後の結果を絞り込みます。
そのため、COUNT()やSUM()などの集計関数を条件として使用できる点が大きな特徴です。
HAVINGはどんな場面で使われるのか
実際のIT現場では、次のような業務で利用されています。
- 社員数が一定以上の部署を抽出する
- 売上合計が目標を超えた商品だけ表示する
- アクセス数が多いIPアドレスを調査する
- エラー発生回数が多いシステムを特定する
- 注文回数が多い顧客を抽出する
データ分析やレポート作成では、HAVINGを利用する機会が多くあります。
なぜHAVINGが重要なのか
GROUP BYだけでは、すべてのグループが表示されます。
しかし、業務では「一定の条件を満たすグループだけ見たい」というケースがほとんどです。
HAVINGを使うことで、必要な集計結果だけを取得できるため、分析や障害調査の効率が向上します。
HAVINGのイメージ
社員テーブル
| 部署名 | 社員名 |
|---|---|
| 営業部 | 山田 |
| 営業部 | 佐藤 |
| 営業部 | 鈴木 |
| 総務部 | 田中 |
GROUP BYで部署ごとの人数を集計すると次のようになります。
| 部署名 | 人数 |
|---|---|
| 営業部 | 3 |
| 総務部 | 1 |
さらにHAVINGを使用して「2人以上」の部署だけ表示すると、営業部だけが表示されます。
| 部署名 | 人数 |
|---|---|
| 営業部 | 3 |
HAVINGの基本構文
SELECT 部署名, COUNT(*) FROM 社員 GROUP BY 部署名 HAVING COUNT(*) >= 2;
このSQLでは、社員が2人以上所属している部署だけを表示します。
WHEREとの違い
| 比較項目 | WHERE | HAVING |
|---|---|---|
| 対象 | 元データ | 集計後のデータ |
| GROUP BY前 | 実行される | 実行されない |
| 集計関数 | 基本的に使用できない | 使用できる |
| 主な用途 | データの絞り込み | 集計結果の絞り込み |
初心者はWHEREは集計前、HAVINGは集計後と覚えると理解しやすくなります。
GROUP BYとの関係
HAVINGは、GROUP BYと組み合わせて使用することが一般的です。
実行される順番は次のとおりです。
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
この順番を理解すると、WHEREとHAVINGの違いが分かりやすくなります。
実際のIT現場での利用例
| 業務 | 利用例 |
|---|---|
| 社員管理 | 社員数が多い部署を抽出する |
| 販売管理 | 売上が多い商品を抽出する |
| アクセスログ分析 | アクセス回数が多いIPアドレスを抽出する |
| システム監視 | エラーが多いサーバーを特定する |
| ヘルプデスク | 問い合わせ件数が多いカテゴリを集計する |
業務でよくあるトラブル
WHEREでCOUNT()を書いてエラーになる
COUNT()などの集計関数はHAVINGで使用します。
GROUP BYを書き忘れる
HAVINGだけでは期待した集計結果にならない場合があります。
件数が想定より少ない
HAVINGの条件が厳しすぎる可能性があります。
原因の切り分け
| 確認項目 | 確認内容 |
|---|---|
| GROUP BY | 正しく指定しているか |
| HAVING条件 | 条件が厳しすぎないか |
| 集計関数 | COUNTやSUMを正しく使用しているか |
| WHERE句 | 必要なデータを除外していないか |
| 元データ | データ件数を確認する |
確認する順番
- 元データを確認する
- WHERE句で絞り込み条件を確認する
- GROUP BYで集計する
- HAVING条件を確認する
- 取得件数を確認する
GUIでの確認方法
- SQL Server Management Studio(SSMS)
- MySQL Workbench
- DBeaver
- pgAdmin
- Oracle SQL Developer
まずGROUP BYだけを実行し、その後HAVINGを追加すると結果の違いを理解しやすくなります。
CUI(コマンド)での確認方法
- mysql
- sqlcmd
- psql
- SQL*Plus
コマンドラインツールからSQLを実行し、集計結果を確認できます。
ログの確認方法
HAVING自体はWindowsイベントログには記録されません。
SQLエラーが発生した場合は、データベースサーバーのエラーログや実行ログを確認します。
イベントビューアーの確認方法
通常は不要です。
データベースサービスの停止や接続エラーが発生した場合のみ、Windowsイベントビューアーを確認します。
PowerShellで確認できること
- データベースサービスの状態確認
- サーバーへの接続確認
- TCPポートの疎通確認
- サービスの起動状態確認
ショートカットキー
| キー | 用途 |
|---|---|
| F5 | SQL実行(SSMS) |
| Ctrl + A | 全文選択 |
| Ctrl + C | 実行停止 |
| Ctrl + F | 検索 |
初心者がやりがちなミス
- WHEREとHAVINGを混同する
- COUNT()をWHERE句に記述する
- GROUP BYを書き忘れる
- HAVING条件を厳しく設定しすぎる
- 実行順序を理解していない
筆者の経験談
システム障害の調査で、エラーコードごとの発生件数を集計していました。当初はGROUP BYだけを使用していましたが、エラー件数が1件のデータまで表示され、重要なエラーを見つけにくい状態でした。
HAVING COUNT(*) >= 10を追加したところ、頻繁に発生しているエラーだけを抽出でき、障害の原因を短時間で特定できました。実務では「集計した後に絞り込む」という考え方が非常に重要です。
上司へ報告するポイント
- 実行したSQL
- 集計対象
- HAVING条件
- 取得件数
- 分析結果
- 業務への影響範囲
エスカレーションするタイミング
- 異常な集計結果が確認された場合
- 大量のエラーが発生している場合
- SQLエラーの原因が特定できない場合
- 本番環境へ影響する可能性がある場合
新人が覚えておくべきポイント
- HAVINGは集計後のデータを絞り込む。
- GROUP BYと一緒に使用することが多い。
- COUNT()やSUM()などの集計関数を条件に指定できる。
- WHEREとは役割が異なる。
- SQLの実行順序を理解すると使い分けしやすい。
関連するIT用語
- SQL(Structured Query Language)
- SELECT
- WHERE
- GROUP BY
- ORDER BY
- COUNT()
- SUM()
- AVG()
よくある質問(FAQ)
HAVINGとWHEREは何が違いますか?
WHEREはグループ化する前のデータを絞り込みます。HAVINGはGROUP BYで集計した後の結果を絞り込みます。
HAVINGだけで使えますか?
データベース製品によってはGROUP BYなしでも使用できる場合がありますが、実務ではGROUP BYと組み合わせて利用することが一般的です。
COUNT()はWHEREで使えますか?
基本的には使用できません。COUNT()などの集計関数を条件として利用する場合はHAVINGを使用します。
まとめ
HAVINGは、GROUP BYで集計した結果に対して条件を指定するSQLの機能です。
売上分析やログ分析、社員数の集計など、IT業務では集計結果を絞り込む場面で頻繁に利用されます。
まずは「WHEREは集計前、HAVINGは集計後」という違いを理解し、GROUP BYと組み合わせて使えるようになると、より実践的なSQLを書けるようになります。
