HAVING句とは?初心者でもわかるデータベース集計の条件指定を徹底解説!
生徒
「先生、SQLのHAVING句(ハビングク)って何に使うんですか?WHERE句(ウェアク)とどう違うんですか?」
先生
「良い質問ですね。HAVING句は、GROUP BY句(グループバイク)でグループ化した結果に対して、さらに条件をつけるときに使う構文なんです。WHERE句ではグループ化前のデータを絞り込み、HAVING句ではグループ化後の集計結果を絞り込むんですよ。」
生徒
「なるほど!つまりHAVING句は集計が終わったあとに使うフィルタみたいなものなんですね?」
先生
「そうです。その通りです。では、HAVING句の使い方を具体的に見ていきましょう。」
1. HAVING句(ハビングク)とは?
HAVING句(読み方:ハビングク)は、SQL(エスキューエル/Structured Query Language)の集計処理で使用される条件指定の構文です。GROUP BY句(グループバイク)でデータをグループ化したあと、その集計結果に対して条件を設定するときに使います。
たとえば、「部署ごとの平均給与を求めて、平均給与が30万円以上の部署だけを表示したい」といったケースでHAVING句が活躍します。WHERE句ではこのような集計後の条件は指定できないため、HAVING句が必要になります。
2. HAVING句の基本構文
HAVING句の基本的な書き方は次のとおりです。
SELECT 列名, 集合関数(列名)
FROM 表名
GROUP BY 列名
HAVING 条件;
この構文のポイントは、「GROUP BYでグループ化したあとにHAVINGで条件を設定する」という順番です。HAVINGは常にGROUP BYのあとに記述します。
3. HAVING句の具体例
たとえば、社員テーブル(employees)から部署ごとの平均給与を求め、平均が30万円以上の部署だけを表示したい場合は、次のように書きます。
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) >= 300000;
このSQL文では、AVG(エーブイジー)という集合関数を使って部署ごとの平均給与を計算しています。そしてHAVING句で「平均給与が30万円以上」という条件を指定しています。
4. WHERE句との違い
HAVING句とWHERE句の違いは、条件を適用するタイミングにあります。
- WHERE句:グループ化する前に行データを絞り込む
- HAVING句:グループ化したあとに集計結果を絞り込む
例えば「営業部だけを対象にして、その中で平均給与が30万円以上の部署を出したい」という場合は、WHERE句とHAVING句を組み合わせて使います。
SELECT department, AVG(salary)
FROM employees
WHERE department = '営業部'
GROUP BY department
HAVING AVG(salary) >= 300000;
このように、WHEREでグループ化前のデータを制限し、HAVINGでグループ化後の条件を指定します。
5. HAVING句で使える主な集合関数
HAVING句では、次のような集合関数(シュウゴウカンスウ)を条件に使うことが多いです。
COUNT():件数を数えるSUM():合計を求めるAVG():平均を求めるMAX():最大値を求めるMIN():最小値を求める
たとえば「社員数が10人以上の部署だけを表示する」場合は次のようになります。
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) >= 10;
このようにHAVING句は、集計した結果に対して柔軟に条件を設定できます。
6. HAVING句とORDER BY句の併用
HAVING句で条件を絞り込んだあと、結果を並び替えるにはORDER BY句(オーダーバイク)を使います。例えば、平均給与が30万円以上の部署を高い順に並べたいときは次のように書きます。
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) >= 300000
ORDER BY AVG(salary) DESC;
このように、HAVING句で条件を指定した後にORDER BYで並び替えると、結果がより見やすくなります。
7. HAVING句が使われる実務シーン
HAVING句は、売上や社員数などの「集計データを分析」するときによく使われます。例えば、月ごとの売上データをグループ化して、「売上が100万円以上の月だけを表示」したい場合などです。
SELECT month, SUM(sales)
FROM sales_data
GROUP BY month
HAVING SUM(sales) >= 1000000;
このSQL文を使うことで、条件を満たした集計結果だけを表示でき、ビジネス分析やレポート作成で大変役立ちます。
8. HAVING句の注意点
HAVING句では、基本的に集合関数を使った条件を指定します。個々の行データに対する条件はWHERE句で指定しなければなりません。間違ってHAVING句の中で個別データの条件を指定すると、エラーや意図しない結果になることがあります。
また、HAVING句はSQLの実行順序の中で、GROUP BY句の後に処理されます。したがって、HAVING句を使うときは、まずどの列でグループ化しているのかをしっかり確認しておきましょう。
9. HAVING句の歴史と今後の活用
HAVING句は、SQLの標準仕様として古くから存在する構文で、リレーショナルデータベース(RDB/アールディービー)の基本要素のひとつです。現在では、MySQL(マイエスキューエル)、PostgreSQL(ポストグレスキューエル)、Oracle(オラクル)、SQL Server(エスキューエルサーバー)など、あらゆるデータベースで利用できます。
さらに、クラウド環境でもHAVING句は欠かせません。Google BigQuery(グーグルビッグクエリ)やAmazon Redshift(アマゾンレッドシフト)などの分析サービスでも同じ構文が使えます。つまり、HAVING句を理解しておくことは、データベースを扱う上での基礎力を高め、実務でも役立つ重要なスキルといえるでしょう。