MySQLに実装されている”GROUP BY”句を使えば、指定したカラムをまとめてグループ化することが出来ます。
このGROUP BY句を使うことでデータの数を数えたり、平均値などの計算を容易にさせることが出来るようになります。
今回はこのGROUP BYについて解説していきますので是非覚えてみてください。
データのグループ化
“GROUP BY”句はSELECT句と並行して使用することで、指定したカラムを基準としたグループにまとめて取得できます。
記述は以下のようになります。
SELECT [カラム名] FROM [テーブル名] GROUP BY [カラム名];
値を計算させたい場合には、この様式に更にCOUNT関数などを足すことで指定したカラムを基準として計算させることも出来ます。
COUNT関数を使った記述例は以下の通りです。
SELECT [カラム名], COUNT([カラム名]) FROM [テーブル名] GROUP BY [カラム名];
なおグループ化すると取得できるデータはグループだけとなります。
グループ化されたデータから条件を指定し、その条件に合うものだけを抽出する場合には、更にHAVING 句で抽出条件を記述します。
この場合の記述は以下の通りとなります。
SELECT [カラム名], COUNT([カラム名]) FROM [テーブル名] GROUP BY [カラム名] HAVING [抽出条件];
MySQLでの動きを見る
では実際にMySQLでの動きを見ていきましょう。
まずは予め作っておいた表を見てみましょう。
+----+--------+-------+-------+ | id | type | color | price | +----+--------+-------+-------+ | 1 | Bag | white | 5000 | | 2 | Bag | black | 2500 | | 3 | Bag | black | 20000 | | 4 | Wallet | white | 15000 | | 5 | Wallet | black | 6000 | | 6 | Bag | black | 30000 | | 7 | Bag | white | 1500 | | 8 | Wallet | black | 4500 | | 9 | Other | black | 3500 | +----+--------+-------+-------+
このようなテーブルがあるとします。
まずは基本的なGROUP BYのみを使用してグループ化させてみましょう。
select type from sample_db.sample_table group by type; +--------+ | type | +--------+ | Bag | | Other | | Wallet | +--------+ 3 rows in set (0.000 sec)
グループで表示させると、リストの中には3種類のアイテムがあることが確認できます。
では次に、type毎にpriceの合計を表示させてみましょう。
合計を出すにはSUM関数を使用します。
select type, sum(price) from sample_db.sample_table group by type; +--------+------------+ | type | sum(price) | +--------+------------+ | Bag | 59000 | | Other | 3500 | | Wallet | 25500 | +--------+------------+ 3 rows in set (0.000 sec)
SUM関数を使用することで、種類毎に合計金額がいくらになるのかを出力出来たことが確認できます。
続いてもう少し詳細にグループ化し、”type”と”color”の二つのグループで合計金額を出してみましょう。
select type, color, sum(price) from sample_db.sample_table group by type, color; +--------+-------+------------+ | type | color | sum(price) | +--------+-------+------------+ | Bag | black | 52500 | | Bag | white | 6500 | | Other | black | 3500 | | Wallet | black | 10500 | | Wallet | white | 15000 | +--------+-------+------------+ 5 rows in set (0.000 sec)
上のクエリでは、BagとWallet、そしてOtherをそれぞれ色毎にグループ化し、その合計金額を算出したクエリとなっています。
結果を見ると”type”と”color”でグループ化され出力されていることが確認できます。
COUNT関数を使う
先ほども簡単に触れたように、COUNT関数を使えば指定したカラムをグループ化した上でグループ内の数を出力させることが出来ます。
下の例を見てみましょう。
select type, count(type) as Expensive from sample_db.sample_table where price > 10000 group by type; +--------+-----------+ | type | Expensive | +--------+-----------+ | Bag | 2 | | Wallet | 1 | +--------+-----------+ 2 rows in set (0.000 sec)
上のクエリでは10000円以上の価格のアイテム個数を表示させています。
Bagには2つ、Walletには1つのアイテムが存在することが確認できます。
更にこの条件にHAVINGを使って2つ以上のアイテムが存在するレコードを表示させてみます。
select type, count(type) as Expensive from sample_db.sample_table where price > 10000 group by type having 2 <= Expensive; +------+-----------+ | type | Expensive | +------+-----------+ | Bag | 2 | +------+-----------+ 1 row in set (0.000 sec)
このように、GROUP BYの後ろに更に続けてHAVING句で条件を指定することで、より厳格な条件を指定し抽出することが確認できます。
まとめ
いかがでしたか?
今回はGROUP BY句について色々なケースを紹介しながら解説してみました。
データを表示させる際にはデータベース内で出来ることは完結に済ませた方が良い場合も多くあります。
また場合によっては表示されるまでの時間やサーバーに係る負荷の軽減にも一役買ってくれることもあります。
これらのコマンドを駆使してデータを効率よく取り出せるよう何度も繰り返し練習してみましょう。
WHERE句とHAVING句の違いについて
WHERE句とHAVING句は同じような動きに思えますが、優先順位が全く異なります。
具体的な違いは以下の通りです。
WHERE句=グループ化する前に条件を抽出
HAVING句=グループ化した後で条件を抽出