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

みなさんこんにちは。フリーランスプログラマーのsatoです。

今回は、グループ化を行う「GROUP BY」句について見てきましょう。

これを使いこなせれば、種類ごとに集計をかけることが簡単にできるようになりますよ!

  • [基本]「GROUP BY」とは
  • [基本]「GROUP BY」の使い方
  • [基本]「WHERE」で集計【前】を絞ろう
  • [応用]「HAVING」で集計【後】を絞ろう
  • [応用]集計関数を覚えよう

まずは基本的な使い方を学び、条件を絞る際にあつかう「WHERE」や「HAVING」などについて見ていきましょう。

最後によく合わせて使用される「集計関数」まで見ておきましょう。

「GROUP BY」とは

先ほどもお伝えした通り「GROUP BY」とは、グループ化を行うために使用される命令です。

主に「種類ごとに集計関数を使用する」などといった形で使用するケースが多いでしょうか。例えば「チームごとの人数を調べる」なんて使い方でしょうか。

以下のように、名前とチームが入っている「userテーブル」があったとします。

  1. +--------+------------+
  2. | name | team |
  3. +--------+------------+
  4. | 山田 | チームA |
  5. | 鈴木 | チームA |
  6. | 加藤 | チームA |
  7. | 田中 | チームB |
  8. | 小林 | チームB |
  9. +--------+------------+

その場合以下のように、グループ化を行う「GROUP BY」と数を数える「COUNT」を利用すれば、グループごとの人数を算出出来るでしょう。

  1. SELECT team, COUNT(team) FROM user GROUP BY team;
  1. +------------+-------------+
  2. | team | COUNT(team) |
  3. +------------+-------------+
  4. | チームA | 3 |
  5. | チームB | 2 |
  6. +------------+-------------+

確かにグループごとの人数を表示することができましたね。なんとなくでも、その使い方を理解頂けたなら幸いです。

次にその具体手な使い方を学んでいきましょう。



「GROUP BY」の使い方

それでは具体的な使い方を見てみましょう。

「GROUP BY」を使う場合、基本的に以下のような書き方をします。

  1. select [表示する要素名] from [テーブル名] GROUP BY [グループ化する要素名];

「GROUP BY」部分に着目してみてみましょう。

「GROUP BY」の後ろに、グループ化したい要素名を入れるだけですね!

  1. GROUP BY [グループ化する要素名];

非常に簡単ですね。

[補足]「GROUP BY」の表示指定の注意点

理屈で考えれば、理解しやすいと思いますが…

グループ化をしたのならば、グループ化された情報を表示する指定にしなければなりません。

先ほどのチームの表示の例を見てみましょう。

  1. SELECT team, COUNT(team) FROM user GROUP BY team;
  1. +------------+-------------+
  2. | team | COUNT(team) |
  3. +------------+-------------+
  4. | チームA | 3 |
  5. | チームB | 2 |
  6. +------------+-------------+

team(チーム)でグループ化を行ったので、team(チーム)とそのカウントのみを、selectの表示対象としています。

これなら問題ありませんね!

しかし例えば、以下のように「team(チーム)」でグループ化しているのに、名前を表示しようとしたなんて場合はエラーとなります。

  1. SELECT name FROM user GROUP BY team;

teamでグループ化されている情報に対して、個別に名前を出すなんて表示的にも不可能ですものね…

初心者の頃は、この辺りで混乱する方も多いと思います。

この点に注意しましょう!

あわせて条件を絞って使ってみよう!

もちろん「WHERE」や「HAVING」で条件を絞ることも可能です。

ここではそんな条件判定について見ていきましょう。

「WHERE」と「HAVING」の違い

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

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

「WHERE」・・・「GROUP BY」の影響の前に条件が適応される
「HAVING」・・・「GORUP BY」の影響のあとに条件が適応される

つまり「WHERE」は「グループ化される前に、特定ユーザーを省く」時などに使用することになります。

逆に「HAVING」はグループかされたあとに反映されるため「人数の少ないグループを表示から省く」なんてことに利用できます。

それでは実際に見ていきましょう。

今回も先ほどと同じく以下の「userテーブル」を例として使用していきます。

  1. +--------+------------+
  2. | name | team |
  3. +--------+------------+
  4. | 山田 | チームA |
  5. | 鈴木 | チームA |
  6. | 加藤 | チームA |
  7. | 田中 | チームB |
  8. | 小林 | チームB |
  9. +--------+------------+

「WHERE」で集計【前】を絞ろう

「WHERE」を同時に使う場合は「GROUP BY」の前に書くことになります。

以下は、グループ化の際に「山田さん」だけ弾く場合の例です。

  1. SELECT team,COUNT(team) FROM user WHERE name!="山田" GROUP BY team;
  1. +------------+-------------+
  2. | team | COUNT(team) |
  3. +------------+-------------+
  4. | チームA | 2 |
  5. | チームB | 2 |
  6. +------------+-------------+

山田さんが弾かれたことにより、チームAは二人と表示されることになりました。

「HAVING」で集計【後】を絞ろう

次に「HAVING」です。

以下の例は、グループ化したのち、所属が3人以上のグループのみ表示している例です。

  1. SELECT team,COUNT(team) AS team_num FROM user GROUP BY team HAVING 3 <= team_num;

※「AS」は、別名をつけるコマンドです。カウント結果に「team_num」という名前をつけ、それをHAVING内で判定に使っているわけですね!

  1. +------------+----------+
  2. | team | team_num |
  3. +------------+----------+
  4. | チームA | 3 |
  5. +------------+----------+

結果、人数が3人以上いる「チームA」のみが表示されうことになります。

またHAVINGとWHEREの呼ばれる順番などの詳細は、以下リンクにまとめてあります!


【SQL】一目でわかる!HAVINGとWHEREの違いと活用方法
更新日 : 2021年8月1日

集計関数を覚えよう

今回は、数を集計するCOUNT関数を多用しました。こちらの関数の詳細と、その他集計関数は以下の記事にまとめてあります。

「GROUP BY」とは、切っても切り離せない関数たちです。

ぜひ参考にしてみてください。


SQLで数を数えよう!COUNT関数の基本から応用まで!
更新日 : 2021年8月1日

「ORDER BY」でソートも同時に!

ソートを行う「ORDER BY」とも同時に使用可能です。

詳細は「ORDERY BY」の記事にまとめてあります。

こちらも参考にしてみてください。


SQLで並び替え!ORDER BYを基礎から応用まで学ぼう!
更新日 : 2021年8月1日

まとめ

いかがでしたでしょうか。

今回はグループ化を行う「GROUP BY」について見てきました。正直他の主要な命令と比べると、利用するタイミングは限られてくるとは思います。(もちろん作業内容にはよりますが…)

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

ぜひ今回の内容を足