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