【SQL】GROUP BYで自在に集計!集計関数やHAVINGと合わせて使おう

みなさんこんにちは。フリーランスプログラマーの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」の違い

「この二つで条件を絞ることができる」と先ほどいいましたが、まずはこの二つの違いから学びましょう。

この二つには以下の違いがあります。

「WHERE」・・・「GROUP BY」の影響の前に条件が適応される
「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」について見てきました。正直他の主要な命令と比べると、利用するタイミングは限られてくるとは思います。(もちろん作業内容にはよりますが…)

とはいえ、ビックデータなどの集計系の作業が最近増えていますし、今後も需要が伸びていくのではないでしょうか。

ぜひ今回の内容を足がかりにしていただけたなら幸いです。

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次