データをグループ化する(GROUP BY句)

GROUP BY 句を使用すると指定したカラムの値を基準にデータをグループ化することができます。グループ化することでデータの数を数える COUNT 関数やデータの平均を計算する AVG 関数をグループ毎に行うことができます。ここでは MariaDB でGROUP BY 句を使ってデータをグループ化する方法について解説します。

(Last modified: )

データをグループ化する

GROUP BY 句を使用することで SELECT 文でデータを取得する時に指定したカラム名の値を基準にグループ化することができます。次のように使います。

SELECT col_name [, col_name ...]
  FROM table_references
  GROUP BY {col_name | expr | position} [ASC | DESC]

GROUP BY 句の後に指定したカラム名の値が同じデータをグループとしてまとめます。複数のカラム名を指定した場合には、カラムの値の組み合わせが同じデータをグループとしてまとめます。

それでは実際に試してみます。次のようなテーブルを作成しました。

create table report (name varchar(10), color varchar(10), sales int);

データをグループ化する(1)

作成したテーブルに次のようなデータを追加しました。

insert into report values ('PC', 'Black', 4500);
insert into report values ('Mobile', 'White', 3800);
insert into report values ('PC', 'White', 5100);
insert into report values ('PC', 'Black', 4600);
insert into report values ('Mobile', 'Black', 3900);
insert into report values ('Mobile', 'White', 4200);

データをグループ化する(2)

最初に name カラムの値を基準にグループ化を行います。次のように実行してください。

select name from report group by name;

データをグループ化する(3)

name カラムの値が同じデータは同じグループとしてまとめられるので、 name カラムの値が重複していないデータを取得することができました。

次にに name カラムと color カラムの組み合わせを基準としてグループ化を行います。次のように実行してください。

select name, color from report group by name, color;

データをグループ化する(4)

今度は name カラムと color カラムの値の組み合わせが同じデータは同じグループとしてまとめられるので、組み合わせの値が重複していないデータを取得することができました。

また sum 関数などと組み合わせることで、指定したカラム毎にデータをグループ化した上でデータを集計することができます。例として name カラムの値を基準としてグループ化を行い、グループ毎に sales カラムの値を集計してみます。次のように実行してください。

select name, sum(sales) from report group by name;

データをグループ化する(5)

name カラムの値毎に sales カラムの値を集計したデータを取得することができました。

なお グループ化してデータの集計を行うときに WITH ROLLUP 修飾子を付けると、グループ毎に集計したデータをすべて集計したデータをあわせて取得することができます。次のように実行してください。

select name, sum(sales) from report group by name with rollup;

データをグループ化する(6)

name カラムの値毎に sales カラムの値を集計したデータを取得すると同時に、集計したデータをすべて合計したデータをあわせて取得することができました。

-- --

MariaDB でGROUP BY 句を使ってデータをグループ化する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。