MySQLでGROUP BYの書き方

MySQLでGROUP BYの書き方

MySQLのGROUP BY句は、データを特定の列に基づいてグループ化するために使用されます。
GROUP BY句を使うことで、グループごとに集計関数を適用したり、統計的な情報を取得することができます。
例えば、売上データを顧客ごとや日付ごとに集計する際等に使用すると便利です。

基本的な書き方の構文は以下の通りです。

SELECT 列名1, 集計関数(列名2)
FROM テーブル名
GROUP BY 列名1;

この例では、列名1の値ごとにデータをグループ化し、グループごとに列名2に対して集計関数を適用します。
よく使われる集計関数には、COUNT()、SUM()、AVG()、MAX()、MIN()などがあります。

GROUP BYの具体例

以下は、顧客ごとの売上総額を集計する例です。

SELECT customer_id, SUM(amount) AS total_sales
FROM sales
GROUP BY customer_id;

このクエリでは、salesテーブル内のcustomer_idごとに売上金額(amount)を合計し、それをtotal_salesというエイリアスで表示しています。
※エイリアスはあってもなくても良いです。
結果として、各顧客の総売上が表示されます。

複数列でのGROUP BY

複数の列でデータをグループ化することも可能です。
例えば、地域と顧客ごとに売上を集計したい場合は、以下のように記述します。

SELECT region, customer_id, SUM(amount) AS total_sales
FROM sales
GROUP BY region, customer_id;

このクエリでは、regionとcustomer_idの組み合わせごとに売上金額を集計します。
つまり、地域ごと、かつ顧客ごとの売上データが取得されます。

HAVING句との組み合わせ

GROUP BY句とよく一緒に使われるのがHAVING句です。
HAVING句は、WHERE句と似ていますが、集計結果に対して条件を指定する場合に使います。
WHERE句はGROUP BYが実行される前に適用されるのに対し、HAVING句はGROUP BYの後に適用されます。

例えば、売上が1000を超える顧客だけを表示したい場合、次のように書きます。

SELECT customer_id, SUM(amount) AS total_sales
FROM sales
GROUP BY customer_id
HAVING total_sales > 1000;

このクエリでは、customer_idごとに売上を合計し、その合計が1000を超える顧客のみが表示されます。
ここでWHERE句にamountが1000を超える顧客を指定すると、結果が変わる可能性があります。

・WHERE句でamount > 1000とした場合
1000以上の売上を集計した平均がtotal_salesに表示される(1000未満は集計に換算されない)

・HAVING句でtotal_sales > 1000とした場合
平均が1000より大きい場合の結果が表示される

ORDER BY句との併用

GROUP BYでグループ化された結果を並べ替えるには、ORDER BY句を使います。
ORDER BY句はGROUP BYの後に記述します。

例えば、顧客ごとの売上を降順に並べたい場合、次のように書きます。

SELECT customer_id, SUM(amount) AS total_sales
FROM sales
GROUP BY customer_id
ORDER BY total_sales DESC;

このクエリでは、customer_idごとの売上合計を集計し、売上の多い順に結果を並べ替えて表示します。
DESCは降順、ASCは昇順を意味します。

GROUP BYとJOINの組み合わせ

GROUP BYは他のテーブルと結合(JOIN)させて使用することもできます。
例えば、顧客テーブルと売上テーブルを結合して、各顧客の名前と総売上を表示するクエリは次のようになります。

SELECT customers.name, SUM(sales.amount) AS total_sales
FROM customers
JOIN sales ON customers.id = sales.customer_id
GROUP BY customers.name;

このクエリでは、customersテーブルとsalesテーブルをcustomer_idで結合し、顧客ごとの売上合計を計算して表示しています。

注意点

1. GROUP BY句でグループ化する際には、SELECT句に含まれる列はすべてGROUP BY句にも含めるか、集計関数を使う必要があります。
例えば、次のようなクエリはエラーになります。

SELECT customer_id, amount
FROM sales
GROUP BY customer_id;

このクエリではamountに集計関数が適用されていないため、エラーが発生します。
正しくは、amountに集計関数(例えば、SUMやAVG)を使用する必要があります。

2. GROUP BY句は大きなデータセットに対して使用すると、パフォーマンスが低下することがあります。
特に複数の列でグループ化を行う場合は、インデックスを適切に設定することが推奨されます。

GROUP BYはデータの集計や分析に便利な機能です。
クエリの設計に応じて、適切な集計関数や条件を組み合わせて使うことで、効果的にデータを処理できます。