SQLにおけるGROUP BY句の使い方をデータベース初心者向けにわかりやすく解説します。
GROUP BY句はテーブルを特定のカラムの値に基づいていくつかのグループに分ける働きをします。主に集計関数(SUM, COUNT, AVG, MIN, MAXなど)と組み合わせて使用され、指定したカラムの値ごとの合計値や平均値、最大値・最小値を取得したいような場合に利用します。
このページではGROUP BY句の構文ルールや使い方、よくある間違いや注意点を網羅的にご説明します。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
SQL:GROUP BY句の使い方・構文ルール
SELECT (カラム名),(カラム名), ・・・・ FROM (テーブル名) GROUP BY (カラム名),(カラム名), ・・・・;
参考 SELECT文
GROUP BY句は、データベースから取得したデータを特定の列に基づいてグループ化する際に使用されます。
グループ化→そのテーブルに含まれる特定の値ごとに切り分けるイメージ。(商品ごと・性別ごと・クラスごと に最大値や平均値を取得するなど。)
GROUP BY句はFROM句の後(WHERE句もあればWHERE句の後)に記述します。
以下のようなテーブルがあり、FM列(男 or 女)でグループ化してそれぞれの合計値を取得するパターンを考えます。
上記の場合に記述すべきSQLは以下の通り。
SELECT FM, SUM(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | SUM | +----------+-----------+ | 男 | 180 | | 女 | 320 | +----------+-----------+ */
FM列(男 or 女)でテーブルをグループ化したいので、GROUP BY句には "FM" 列を指定します。
分かりやすく説明すると、ここでは男女別に合計値を求めたいので、その男女の区別を判定できる "FM" 列をGROUP BY句に記述(=男女別にレコードをグループ化する)します。
GROUP BY句で指定したFM列は「集約キー」や「グループ化列」というように呼ばれます。
"Japanese" 列をSUM関数を用いて記述しているので結果は以下のようになります。
SELECT FM, SUM(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | SUM | +----------+-----------+ | 男 | 180 | | 女 | 320 | +----------+-----------+ */
GROUP BY:集約キーにNULLが含まれる場合
集約キーにNULL値が含まれる場合は、NULLも1つのグループとして認識されます。
つまり、下記のFM列をGROUP BY句で指定した場合、以下のテーブルは「男」「女」「NULL」の3グループに分割されることになります。
この場合、先ほどと全く同様のSQLを流すと結果は以下のようになります。
SELECT FM, SUM(Japanese) FROM PointList GROUP BY FM; /* 実行結果 +----------+-----------+ | FM | SUM | +----------+-----------+ | 男 | 180 | | 女 | 320 | | NULL | 110 | ←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関数について詳しく知りたい方は以下の記事をどうぞ。
SQLを1から学習したい方は
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。
SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。