「GROUP BY句」を使えば、指定したカラムの値を基準にしたデータをグループ化できます。
データの平均値を求めたりCOUNTを使ったクエリを構築する場合に非常に便利で、SQLでは使用頻度の高いクエリです。
そこで今回はこの「GROUP BY句」について解説してみたいと思います。
GROUP BY句とは
冒頭でも述べたように、「GROUP BY」はグループ化を行うための命令句です。
よく使われるケースとしては、カラム毎の集計結果の表示などでしょうか。
このGROUP BY句ですが、単体で使うことはほとんどありません。
最も基本的なものであればCOUNT句と一緒に使用したりします。
例えば次のテーブルを見てください。
Name Color StandardCost Size SellStartDate -------------------------------------------------- --------------- --------------------- ----- ----------------------- HL Road Frame - Black, 58 Black 1059.3100 58 2002-06-01 00:00:00.000 HL Road Frame - Red, 58 Red 1059.3100 58 2002-06-01 00:00:00.000 Sport-100 Helmet, Red Red 13.0863 NULL 2005-07-01 00:00:00.000 Sport-100 Helmet, Black Black 13.0863 NULL 2005-07-01 00:00:00.000 Mountain Bike Socks, M White 3.3963 M 2005-07-01 00:00:00.000 Mountain Bike Socks, L White 3.3963 L 2005-07-01 00:00:00.000 Sport-100 Helmet, Blue Blue 13.0863 NULL 2005-07-01 00:00:00.000 AWC Logo Cap Multi 6.9223 NULL 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, S Multi 38.4923 S 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, M Multi 38.4923 M 2005-07-01 00:00:00.000
このテーブルの中で「Color」を基準に個数をカウントしたい場合があったとします。
この場合には「COUNT」と「GROUP BY」を同時に使用することで色毎のカウントが成立します。
SELECT Color, COUNT(Color) FROM Product GROUP BY Color; GO Color --------------- ----------- Black 2 Blue 1 Multi 3 Red 2 White 2
今はまだこういった形で使うということだけを漠然と理解していただくだけで大丈夫です。
これから具体的な使い方を解説していきたいと思います。
GROUP BY句の使い方
それでは早速、GROUP BY句の使い方について見ていきましょう。
基本的な記述は次のように行います。
SELECT col_name1 [, col_name2 ...] FROM table_name GROUP BY col_name, ...
基本的にGROUP BYまでは通常のSELECT文ですので気にする必要はありません。
問題はGROUP BYの後ですが、こちらも普通にカラム名を指定するだけなので特に難しく考える必要はないと思います。
GROUP BYでグループ化されたSELECT文のデータはグループの数だけ表示されます。
よってGROUP BY句を使う際には何の数字なのかわかりやすくするため、COUNT句と一緒に基となるカラム名を表示することが基本となります。
次のコードを見てください。
SELECT COUNT(Color) FROM Product GROUP BY Color; GO ----------- 0 89 26 1 8 38 36 7 4 36
このコードはProductテーブルの中からColorを基準にGROUP BYで区分けしたものですが、これを見て何のことかわかる人はいませんよね。
こういったことが起きないように必ず基準としたカラムを一緒に添える必要があるわけです。
WHERE/HAVINGで条件を絞る
COUNT句以外にも条件を絞りつつGROUP BYを使う時に使われるのがWHERE句とHAVING句です。
この二つには若干の違いがあるため、まずはこの二つの違いについて解説します。
WHERE句
WHERE句はGROUP BY句を実行する前に条件を適用する場合に使用します。
分かりやすく言うと、集計したいカラムから特定のレコードをはじく場合などです。
SELECT TOP 20 * FROM Product GO Name Color StandardCost Size SellStartDate -------------------------------------------------- --------------- --------------------- ----- ----------------------- HL Road Frame - Black, 58 Black 1059.3100 58 2002-06-01 00:00:00.000 HL Road Frame - Red, 58 Red 1059.3100 58 2002-06-01 00:00:00.000 Sport-100 Helmet, Red Red 13.0863 NULL 2005-07-01 00:00:00.000 Sport-100 Helmet, Black Black 13.0863 NULL 2005-07-01 00:00:00.000 Mountain Bike Socks, M White 3.3963 M 2005-07-01 00:00:00.000 Mountain Bike Socks, L White 3.3963 L 2005-07-01 00:00:00.000 Sport-100 Helmet, Blue Blue 13.0863 NULL 2005-07-01 00:00:00.000 AWC Logo Cap Multi 6.9223 NULL 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, S Multi 38.4923 S 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, M Multi 38.4923 M 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, L Multi 38.4923 L 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, XL Multi 38.4923 XL 2005-07-01 00:00:00.000 HL Road Frame - Red, 62 Red 868.6342 62 2005-07-01 00:00:00.000 HL Road Frame - Red, 44 Red 868.6342 44 2005-07-01 00:00:00.000 HL Road Frame - Red, 48 Red 868.6342 48 2005-07-01 00:00:00.000 HL Road Frame - Red, 52 Red 868.6342 52 2005-07-01 00:00:00.000 HL Road Frame - Red, 56 Red 868.6342 56 2005-07-01 00:00:00.000 LL Road Frame - Black, 58 Black 204.6251 58 2005-07-01 00:00:00.000 LL Road Frame - Black, 60 Black 204.6251 60 2005-07-01 00:00:00.000 LL Road Frame - Black, 62 Black 204.6251 62 2005-07-01 00:00:00.000 SELECT Color, COUNT(Color) AS colorNum FROM ( SELECT TOP 20 Color FROM Product ) AS COLOR WHERE COLOR.Color != 'Black' GROUP BY COLOR.Color Color colorNum --------------- ----------- Blue 1 Multi 5 Red 7 White 2
HAVING句
HAVING句はGROUP BY句を実行後にHAVINNG句で指定した条件を実行します。
例えば、テーブルから色毎に数を集計し、その集計結果から特定の色の数のみ表示させるといった場合などです。
二つの違い
この二つについての違いは実行のタイミングのみなので、「WHEREは先でHAVINGは後」とだけ覚えておけば良いでしょう。
まとめ
いかがでしたか?
今回はSQLでのグループ化ということで「GROUP BY句」について解説してみました。
グループ化は非常によく使う命令なので、初心者の方はこの記事をよく読んで仕組みを正しく理解しておくとこの先の学習においてもグッと楽になると思います。
しっかりマスターしておきましょう!