みなさんこんにちは。フリーランスプログラマーのsatoです。
今回は、グループ化を行う「GROUP BY」句について見てきましょう。
これを使いこなせれば、種類ごとに集計をかけることが簡単にできるようになりますよ!
- [基本]「GROUP BY」とは
- [基本]「GROUP BY」の使い方
- [基本]「WHERE」で集計【前】を絞ろう
- [応用]「HAVING」で集計【後】を絞ろう
- [応用]集計関数を覚えよう
まずは基本的な使い方を学び、条件を絞る際にあつかう「WHERE」や「HAVING」などについて見ていきましょう。
最後によく合わせて使用される「集計関数」まで見ておきましょう。
「GROUP BY」とは
先ほどもお伝えした通り「GROUP BY」とは、グループ化を行うために使用される命令です。
主に「種類ごとに集計関数を使用する」などといった形で使用するケースが多いでしょうか。例えば「チームごとの人数を調べる」なんて使い方でしょうか。
以下のように、名前とチームが入っている「userテーブル」があったとします。
+--------+------------+ | name | team | +--------+------------+ | 山田 | チームA | | 鈴木 | チームA | | 加藤 | チームA | | 田中 | チームB | | 小林 | チームB | +--------+------------+
その場合以下のように、グループ化を行う「GROUP BY」と数を数える「COUNT」を利用すれば、グループごとの人数を算出出来るでしょう。
SELECT team, COUNT(team) FROM user GROUP BY team;
+------------+-------------+ | team | COUNT(team) | +------------+-------------+ | チームA | 3 | | チームB | 2 | +------------+-------------+
確かにグループごとの人数を表示することができましたね。なんとなくでも、その使い方を理解頂けたなら幸いです。
次にその具体手な使い方を学んでいきましょう。
「GROUP BY」の使い方
それでは具体的な使い方を見てみましょう。
「GROUP BY」を使う場合、基本的に以下のような書き方をします。
select [表示する要素名] from [テーブル名] GROUP BY [グループ化する要素名];
「GROUP BY」部分に着目してみてみましょう。
「GROUP BY」の後ろに、グループ化したい要素名を入れるだけですね!
GROUP BY [グループ化する要素名];
非常に簡単ですね。
[補足]「GROUP BY」の表示指定の注意点
理屈で考えれば、理解しやすいと思いますが…
グループ化をしたのならば、グループ化された情報を表示する指定にしなければなりません。
先ほどのチームの表示の例を見てみましょう。
SELECT team, COUNT(team) FROM user GROUP BY team;
+------------+-------------+ | team | COUNT(team) | +------------+-------------+ | チームA | 3 | | チームB | 2 | +------------+-------------+
team(チーム)でグループ化を行ったので、team(チーム)とそのカウントのみを、selectの表示対象としています。
これなら問題ありませんね!
しかし例えば、以下のように「team(チーム)」でグループ化しているのに、名前を表示しようとしたなんて場合はエラーとなります。
SELECT name FROM user GROUP BY team;
teamでグループ化されている情報に対して、個別に名前を出すなんて表示的にも不可能ですものね…
初心者の頃は、この辺りで混乱する方も多いと思います。
この点に注意しましょう!
合わせて条件を絞って使ってみよう!
もちろん「WHERE」や「HAVING」で条件を絞ることも可能です。
ここではそんな条件判定について見ていきましょう。
「WHERE」と「HAVING」の違い
「この二つで条件を絞ることができる」と先ほどいいましたが、まずはこの二つの違いから学びましょう。
この二つには以下の違いがあります。
「HAVING」・・・「GORUP BY」の影響のあとに条件が適応される
つまり「WHERE」は「グループ化される前に、特定ユーザーを省く」時などに使用することになります。
逆に「HAVING」はグループかされたあとに反映されるため「人数の少ないグループを表示から省く」なんてことに利用できます。
それでは実際に見ていきましょう。
今回も先ほどと同じく以下の「userテーブル」を例として使用していきます。
+--------+------------+ | name | team | +--------+------------+ | 山田 | チームA | | 鈴木 | チームA | | 加藤 | チームA | | 田中 | チームB | | 小林 | チームB | +--------+------------+
「WHERE」で集計【前】を絞ろう
「WHERE」を同時に使う場合は「GROUP BY」の前に書くことになります。
以下は、グループ化の際に「山田さん」だけ弾く場合の例です。
SELECT team,COUNT(team) FROM user WHERE name!="山田" GROUP BY team;
+------------+-------------+ | team | COUNT(team) | +------------+-------------+ | チームA | 2 | | チームB | 2 | +------------+-------------+
山田さんが弾かれたことにより、チームAは二人と表示されることになりました。
「HAVING」で集計【後】を絞ろう
次に「HAVING」です。
以下の例は、グループ化したのち、所属が3人以上のグループのみ表示している例です。
SELECT team,COUNT(team) AS team_num FROM user GROUP BY team HAVING 3 <= team_num;
※「AS」は、別名をつけるコマンドです。カウント結果に「team_num」という名前をつけ、それをHAVING内で判定に使っているわけですね!
+------------+----------+ | team | team_num | +------------+----------+ | チームA | 3 | +------------+----------+
結果、人数が3人以上いる「チームA」のみが表示されうことになります。
またHAVINGとWHEREの呼ばれる順番などの詳細は、以下リンクにまとめてあります!
集計関数を覚えよう
今回は、数を集計するCOUNT関数を多用しました。こちらの関数の詳細と、その他集計関数は以下の記事にまとめてあります。
「GROUP BY」とは、切っても切り離せない関数たちです。
ぜひ参考にしてみてください。
「ORDER BY」でソートも同時に!
ソートを行う「ORDER BY」とも同時に使用可能です。
詳細は「ORDERY BY」の記事にまとめてあります。
こちらも参考にしてみてください。
まとめ
いかがでしたでしょうか。
今回はグループ化を行う「GROUP BY」について見てきました。正直他の主要な命令と比べると、利用するタイミングは限られてくるとは思います。(もちろん作業内容にはよりますが…)
とはいえ、ビックデータなどの集計系の作業が最近増えていますし、今後も需要が伸びていくのではないでしょうか。
ぜひ今回の内容を足がかりにしていただけたなら幸いです。