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

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

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

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次