公開:

SQLのGROUP BYとは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


GROUP BYとは

GROUP BYはSQLにおいてデータを集約する際に使用される句です。GROUP BYを使用することで、指定したカラムの値が同じレコードをグループ化し、集計関数を適用することができます。

例えば、社員テーブルから部署ごとの平均給与を算出する場合、部署カラムでグループ化し、AVG関数で給与の平均値を計算します。GROUP BYを使用しない場合、全社員の平均給与しか算出できません。

GROUP BYを使用する際はSELECT句で指定するカラムはGROUP BYで指定したカラムか集計関数を使用したカラムのみに制限されます。これに違反すると、エラーが発生します。

また、GROUP BYの結果に条件を付けてフィルタリングしたい場合はHAVING句を使用します。WHERE句とは異なり、HAVING句ではグループ化された後の結果に対して条件を指定できます。

GROUP BYはデータ分析や統計処理において非常に重要な機能です。大量のデータから特定のグループごとの傾向や特徴を把握する際に威力を発揮します。

GROUP BYを使用する際の注意点

「GROUP BYを使用する際の注意点」に関して、以下3つを簡単に解説していきます。

  • SELECT句で指定できるカラムの制限
  • GROUP BYとORDER BYの組み合わせ
  • GROUP BYとHAVING句の使い方

SELECT句で指定できるカラムの制限

GROUP BYを使用する際、SELECT句で指定できるカラムには制限があります。GROUP BYで指定したカラムか、集計関数を使用したカラムのみを指定できます。

例えば、部署ごとの平均給与を算出する場合、SELECT句で部署名と平均給与を指定できますが、社員名を指定することはできません。社員名はグループ化されていないため、エラーが発生します。

この制限を理解していないと、GROUP BYを使用する際に思わぬエラーに遭遇する可能性があります。SELECT句で指定するカラムは慎重に選択する必要があります。

GROUP BYとORDER BYの組み合わせ

GROUP BYとORDER BYを組み合わせることで、グループ化された結果を特定の条件で並べ替えることができます。例えば、部署ごとの平均給与を算出し、平均給与の高い順に並べ替える場合は以下のようなSQLになります。

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
ORDER BY avg_salary DESC;

ただし、ORDER BYで指定できるカラムも、SELECT句と同様にGROUP BYで指定したカラムか集計関数を使用したカラムに限定されます。この点に注意が必要です。

GROUP BYとHAVING句の使い方

GROUP BYの結果に条件を付けてフィルタリングしたい場合はHAVING句を使用します。例えば、部署ごとの平均給与を算出し、平均給与が50万円以上の部署のみを抽出する場合は以下のようなSQLになります。

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 500000;

HAVING句では集計関数を使用した条件を指定できます。一方、WHERE句では集計前のレコードに対して条件を指定するため、集計関数は使用できません。GROUP BYを使用する際はWHERE句とHAVING句の違いを理解しておく必要があります。

GROUP BYを使用するメリット

「GROUP BYを使用するメリット」に関して、以下3つを簡単に解説していきます。

  • データの要約と集計
  • レポート作成の効率化
  • パフォーマンスの向上

データの要約と集計

GROUP BYを使用することで、大量のデータを要約し、グループごとの集計値を算出できます。例えば、売上データから商品カテゴリごとの売上合計を算出することで、どのカテゴリが売上に貢献しているかを把握できます。

GROUP BYを使用しない場合、プログラム側で集計処理を行う必要があります。しかし、GROUP BYを使用すればデータベース側で集計処理を行うため、プログラムの負担を軽減できます。

また、GROUP BYとHAVING句を組み合わせることで、特定の条件を満たすグループのみを抽出できます。これにより、データの絞り込みが容易になります。

レポート作成の効率化

GROUP BYを使用することで、レポート作成の効率を大幅に向上できます。例えば、月次売上レポートを作成する際、GROUP BYを使用して月ごとの売上合計を算出すれば、レポートに必要なデータをすぐに取得できます。

レポート作成では同じような集計処理を繰り返し行うことが多くあります。GROUP BYを活用することで、集計処理を一度SQLで定義すれば、何度でも再利用できます。

また、GROUP BYとORDER BYを組み合わせることで、レポートの並べ替えも容易に行えます。これにより、レポートの可読性を高められます。

パフォーマンスの向上

GROUP BYを使用することで、クエリのパフォーマンスを向上できる場合があります。例えば、多数のレコードから特定のグループごとの集計値を算出する場合、GROUP BYを使用しないとプログラム側で多数のレコードを処理する必要があります。

一方、GROUP BYを使用すれば、データベース側で効率的に集計処理を行えます。特に、適切なインデックスを設定することで、GROUP BYのパフォーマンスを大幅に改善できます。

ただし、GROUP BYを使用しても、結果セットに多数のグループが含まれる場合はパフォーマンスが低下する可能性があります。GROUP BYを使用する際はパフォーマンスにも注意が必要です。

GROUP BYを使用する際のTips

「GROUP BYを使用する際のTips」に関して、以下3つを簡単に解説していきます。

  • 集計関数と組み合わせる
  • CASE式と組み合わせる
  • WITH句と組み合わせる

集計関数と組み合わせる

GROUP BYは集計関数と組み合わせることで真価を発揮します。代表的な集計関数として、COUNT、SUM、AVG、MAX、MINなどがあります。これらの関数を使用することで、グループごとのレコード数、合計値、平均値、最大値、最小値などを算出できます。

例えば、商品テーブルから商品カテゴリごとの在庫数の合計を算出する場合、以下のようなSQLを記述します。このように、GROUP BYと集計関数を組み合わせることで、グループごとの統計情報を容易に取得できます。

SELECT category, SUM(stock) AS total_stock
FROM products
GROUP BY category;

CASE式と組み合わせる

GROUP BYはCASE式と組み合わせることで、より柔軟な集計処理を行えます。CASE式を使用することで、条件に応じて値を変換したり、グループを細分化したりできます。

例えば、商品テーブルから価格帯ごとの商品数を集計する場合、以下のようなSQLを記述します。CASE式を使用して価格帯を判定し、COUNT関数で商品数を集計しています。

SELECT
  CASE
    WHEN price < 1000 THEN 'Low'
    WHEN price >= 1000 AND price < 5000 THEN 'Middle'
    ELSE 'High'
  END AS price_range,
  COUNT(*) AS product_count
FROM products
GROUP BY
  CASE
    WHEN price < 1000 THEN 'Low'
    WHEN price >= 1000 AND price < 5000 THEN 'Middle'
    ELSE 'High'
  END;

このように、CASE式を活用することで、GROUP BYの柔軟性が広がります。条件に応じたグループ化や、複雑な集計処理が可能になります。

WITH句と組み合わせる

GROUP BYはWITH句と組み合わせることで、複雑なクエリを読みやすくできます。WITH句を使用することで、クエリの一部を別名で定義し、再利用できます。

例えば、部署ごとの平均給与を算出し、全体の平均給与と比較する場合、以下のようなSQLを記述します。WITH句で部署ごとの平均給与を算出し、メインクエリでWITH句の結果を使用しています。

WITH dept_avg_salary AS (
  SELECT department, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY department
)
SELECT
  department,
  avg_salary,
  (SELECT AVG(salary) FROM employees) AS total_avg_salary
FROM dept_avg_salary;

このように、WITH句を活用することで、GROUP BYを使用した集計処理を部分的に定義できます。これにより、クエリの可読性が向上し、複雑なクエリを管理しやすくなります。

※上記コンテンツはAIで確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。

「コンピュータ」に関するコラム一覧「コンピュータ」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。