
SQLにおけるGROUP BY句の使い方をデータベース初心者向けにわかりやすく解説します。
GROUP BY句はテーブルをいくつかのグループに分ける働きをします。指定したカラムの値ごとの合計値や平均値、最大値・最小値を取得したいような場合に利用します。

このページではGROUP BY句の構文ルールや使い方、よくある間違いや注意点を網羅的にご説明します。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
SQL:GROUP BY句の使い方・構文ルール
SELECT (カラム名),(カラム名), ・・・・ FROM (テーブル名) GROUP BY (カラム名),(カラム名), ・・・・;
GROUP BY句はFROM句の後(WHERE句もあればWHERE句の後)に記述し、GROUP BY に続けてグループ化のキーとしたいカラム名を指定します。

以下のようなテーブルがあり、FM列(男 or 女)でグループ化してそれぞれの合計値を取得するパターンを考えます。

上記の場合に記述すべきSQLは以下の通り。
SELECT FM, SUM(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | SUM | +----------+-----------+ | 男 | 180 | | 女 | 320 | */
FM列(男 or 女)でテーブルをグループ化したいので、GROUP BY句には "FM" 列を指定します。

このときGROUP BY句で指定したFM列は「集約キー」や「グループ化列」というように呼ばれます。

"Japanese" 列をSUM関数を用いて記述しているので結果は以下のようになります。
SELECT FM, SUM(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | SUM | +----------+-----------+ | 男 | 180 | | 女 | 320 | */
GROUP BY:集約キーにNULLが含まれる場合
集約キーにNULL値が含まれる場合は、NULLも1つのグループとして認識されます。


この場合、先ほどと全く同様のSQLを流すと結果は以下のようになります。
SELECT FM, SUM(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | SUM | +----------+-----------+ | 男 | 180 | | 女 | 320 | | NULL | 110 | ←NULLも1つのグループとして集計される */
集約キーにNULLが含まれる場合はNULLも1つのグループとして認識されるという点を理解しておきましょう。
GROUP BY:サンプルコード

GROUP BY関数は一度理解してしまえば、決して難しい内容ではありません。
ここからは、いくつかのサンプルコードを見ていきながらGROUP BY句の動きをより詳しく学んでいきましょう。
ここでは以下5つの集約関数を例にGROUP BY句の動きを解説します。
GROUP BY:COUNT関数
COUNT関数は指定したカラムのレコード数を取得する集約関数です。
SELECT FM, COUNT(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | COUNT | +----------+-----------+ | 男 | 3 | | 女 | 5 | */
指定したFM列の値ごとにレコード数を取得することができます。COUNT関数ではワイルドカードを用いずにカラムを指定した場合NULLがカウントされないため、上記の結果には反映されないという点に注意しましょう。

COUNT関数について詳しく知りたい方は以下の記事をご覧ください。
GROUP BY:SUM関数
SUM関数は指定したレコードの合計値を取得する集約関数です。
SELECT FM, SUM(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | SUM | +----------+-----------+ | 男 | 180 | | 女 | 320 | | NULL | 110 | */

指定したFM列の値ごとにレコードの合計値を取得することができます。
SUM関数について詳しく知りたい方は以下の記事をご覧ください。
GROUP BY:AVG関数
AVG関数は指定したカラムのレコード数を平均値する集約関数です。
SELECT FM, AVG(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | AVG | +----------+-----------+ | 男 | 60 | | 女 | 64 | | NULL | 55 | */

指定したFM列の値ごとにレコードの平均値を取得することができます。
AVG関数について詳しく知りたい方は以下の記事をご覧ください。
GROUP BY:MIN関数
MIN関数は指定したカラムのレコードの最小値を取得する集約関数です。
SELECT FM, MIN(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | MIN | +----------+-----------+ | 男 | 35 | | 女 | 30 | | NULL | 30 | */

指定したFM列の値ごとにレコードの最小値を取得することができます。
MIN関数について詳しく知りたい方は以下の記事をどうぞ。
GROUP BY:MAX関数
MAX関数は指定したカラムのレコードの最大値を取得する集約関数です。
SELECT FM, MAX(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | MAX | +----------+-----------+ | 男 | 75 | | 女 | 95 | | NULL | 80 | */

指定したFM列の値ごとにレコードの最大値を取得することができます。
MAX関数について詳しく知りたい方は以下の記事をどうぞ。
システムエンジニアを目指したい方は
システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。
正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。