PR

【SQL】GROUP BY句の使い方を3分でわかりやすく解説

Database

SQLにおけるGROUP BY句の使い方をデータベース初心者向けにわかりやすく解説します。

GROUP BY句はテーブルを特定のカラムの値に基づいていくつかのグループに分ける働きをします。主に集計関数(SUM, COUNT, AVG, MIN, MAXなど)と組み合わせて使用され、指定したカラムの値ごとの合計値や平均値、最大値・最小値を取得したいような場合に利用します。

SQL GROUP BY
GROUP BY句のイメージ

このページではGROUP BY句の構文ルールや使い方、よくある間違いや注意点を網羅的にご説明します。

このページで学べる内容
  • GROUP BY句の使い方・構文ルール
  • GROUP BY句のサンプルコード
  • GROUP BY句の注意点/よくある間違い

プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

スポンサーリンク

SQL:GROUP BY句の使い方・構文ルール

SELECT    (カラム名),(カラム名), ・・・・
  FROM    (テーブル名)
 GROUP BY (カラム名),(カラム名), ・・・・;

参考 SELECT文

GROUP BY句は、データベースから取得したデータを特定の列に基づいてグループ化する際に使用されます。

グループ化→そのテーブルに含まれる特定の値ごとに切り分けるイメージ。(商品ごと・性別ごと・クラスごと に最大値や平均値を取得するなど。)

GROUP BY句はFROM句の後(WHERE句もあればWHERE句の後)に記述します。

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

SQL GROUP BY
GROUP BY句のイメージ

上記の場合に記述すべき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グループに分割されることになります。

GROUP BY:NULLが含まれる場合

この場合、先ほどと全く同様の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がカウントされないため、上記の結果には反映されないという点に注意しましょう。

GROUP BY:SUM関数

SUM関数は指定したレコードの合計値を取得する集約関数です。

SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
  | 女       | 320       |
  | NULL     | 110       |
  +----------+-----------+
*/

GROUP BY:AVG関数

AVG関数は指定したカラムのレコード数を平均値する集約関数です。

SELECT FM, AVG(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | AVG       |
  +----------+-----------+
  | 男       | 60        |
  | 女       | 64        |
  | NULL     | 55        |
  +----------+-----------+
*/

GROUP BY:MIN関数

MIN関数は指定したカラムのレコードの最小値を取得する集約関数です。  

SELECT FM, MIN(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | MIN       |
  +----------+-----------+
  | 男       | 35        |
  | 女       | 30        |
  | NULL     | 30        |
  +----------+-----------+
*/

GROUP BY:MAX関数

MAX関数は指定したカラムのレコードの最大値を取得する集約関数です。

SELECT FM, MAX(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | MAX       |
  +----------+-----------+
  | 男       | 75        |
  | 女       | 95        |
  | NULL     | 80        |
  +----------+-----------+
*/
GROUP BY句のまとめ
  • GROUP BY句はテーブルをいくつかのグループに分ける働きする
    ⇒指定したカラムの値ごとの合計値や平均値/最大値・最小値を取得したいような場合に利用する
  • GROUP BY句で指定したFM列は「集約キー」や「グループ化列」というように呼ばれる
  • 集約キーにNULLが含まれる場合はNULLも1つのグループとして認識される
SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
  | 女       | 320       |
  | NULL     | 110       |  ←NULLも1つのグループとして集計される
  +----------+-----------+
*/

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました