データをグループ化して、さらに絞り込む方法をマスターしよう!
前回は COUNT
や SUM
などの集計関数を学びましたね。今回は、それらの集計関数と組み合わせて使うことで、SQLの分析能力を格段に向上させる GROUP BY
句と HAVING
句について解説します。これらを使いこなせば、より複雑なデータ集計や分析が可能になります
GROUP BY句: データをグループにまとめる
GROUP BY
句は、テーブル内のデータを特定のカラムの値に基づいてグループ化するための機能です。同じ値を持つ行がひとつのグループにまとめられます。そして、各グループに対して集計関数(COUNT
, SUM
, AVG
など)を適用できます。
例えば、以下のような「社員」テーブル (employees
) があるとします。
employee_id | name | department | salary |
---|---|---|---|
1 | 山田太郎 | 営業部 | 300000 |
2 | 佐藤花子 | 開発部 | 350000 |
3 | 鈴木一郎 | 営業部 | 320000 |
4 | 高橋美咲 | 人事部 | 280000 |
5 | 田中健太 | 開発部 | 400000 |
6 | 渡辺直美 | 営業部 | 290000 |
このテーブルから、部署 (department
) ごとの社員数を知りたい場合、GROUP BY
句を使って次のように書けます。
このクエリを実行すると、部署ごとに社員数が集計された結果が得られます。
department | employee_count |
---|---|
営業部 | 3 |
開発部 | 2 |
人事部 | 1 |
同様に、部署ごとの平均給与を計算することもできます。
HAVING句: グループ化された結果に条件を適用する
GROUP BY
でグループ化した結果に対して、さらに条件を指定して絞り込みたい場合があります。例えば、「社員数が2人以上の部署だけを表示したい」といったケースです。
ここで HAVING
句の出番です! HAVING
句は、GROUP BY
によって作成されたグループに対して条件を指定するためのものです。
WHERE句との違い
条件を指定する句としては WHERE
句もありましたね。HAVING
句と WHERE
句の主な違いは、条件を適用するタイミングです。
WHERE
句: グループ化される前の個々の行に対して条件を適用します。集計関数に対する条件は指定できません。HAVING
句: グループ化された後のグループに対して条件を適用します。集計関数の結果に対する条件を指定できます。
先ほどの例で、「社員数が2人以上の部署」を抽出するには、次のように HAVING
句を使います。
このクエリを実行すると、以下の結果が得られます。
department | employee_count |
---|---|
営業部 | 3 |
開発部 | 2 |
人事部は社員数が1人なので、HAVING
句の条件 (COUNT(*) >= 2
) を満たさず、結果から除外されました。
同様に、「平均給与が30万円を超える部署」を抽出することもできます。
WHERE句とHAVING句の組み合わせ
WHERE
句と HAVING
句は、ひとつのクエリ内で一緒に使うこともできます。これにより、まず個々の行をフィルタリングし、その後でグループ化された結果をさらにフィルタリングするという、より複雑な条件指定が可能です。
例えば、「給与が30万円以上の社員に限定し、その中で部署ごとの人数を計算し、その人数が2人以上の部署のみを表示する」場合、次のように書けます。
このクエリの処理順序は以下のようになります。
FROM employees
: `employees` テーブルからデータを読み込む。WHERE salary >= 300000
: 給与が30万円未満の行を除外する。GROUP BY department
: 残った行を `department` カラムの値でグループ化する。HAVING COUNT(*) >= 2
: 各グループの行数 (社員数) を計算し、2未満のグループを除外する。SELECT department, COUNT(*) AS employee_count
: 最終的に残ったグループの `department` と計算された `employee_count` を表示する。
(実際のSQLの内部的な実行計画はより複雑な場合がありますが、概念的な順序としてこのように理解すると分かりやすいでしょう。)
まとめ
今回は、データをグループ化して集計するための GROUP BY
句と、そのグループ化された結果に条件を適用する HAVING
句について学びました。
GROUP BY
: 特定のカラムの値に基づいて行をグループ化し、集計関数を適用する。HAVING
:GROUP BY
でグループ化された結果に対して、集計結果を用いた条件を指定する。WHERE
はグループ化前の行に、HAVING
はグループ化後のグループに条件を適用する。
これらの句を使いこなすことで、データの集計や分析の幅が大きく広がります。色々な条件で試してみて、その動作をしっかり理解しましょう! 次回は NULL の扱い方について学びます。お楽しみに!
参考情報
- SQL GROUP BY Statement (W3Schools): https://www.w3schools.com/sql/sql_groupby.asp
- SQL HAVING Clause (W3Schools): https://www.w3schools.com/sql/sql_having.asp
- Difference between WHERE and HAVING Clause in SQL (GeeksforGeeks): https://www.geeksforgeeks.org/difference-between-where-and-having-clause-in-sql/