【SQL】「GROUP BY」句とは?基本構文から使用例まで詳しく解説

  • 2025.09.22
       
【SQL】「GROUP BY」句とは?使い方、集計関数などとの組み合わせも詳しく解説

SQLでデータベースを操作する際、「GROUP BY」句を使用してテーブルのカラムをグループ化し、合計件数や最大値・最小値を取得したり、一定の条件やカテゴリで絞り込んだりといった処理を行うことがしばしばあります。

本記事では、「GROUP BY」を使用してデータベースのレコードをグループ化する方法や、集計関数との組み合わせによる様々な集計方法について解説していきます。

「GROUP BY」句とは?

SQLの「GROUP BY」句とは、指定したカラムをグループ化するクエリです。カラムの合計値や件数、最大値・最小値などを取得したり、一定の条件でデータを絞り込んだりする際によく使われます。

SQLでデータベースを操作する際には大量のカラムが存在することも多く、「GROUP BY」でグループ化する操作は必須になります。

このクエリと集計関数や「WHERE」句、「HAVING」句などを一緒に使用することでグループ化するカラムを集計したり、条件に応じてデータを絞り込んだりします。

【GROUP BY句の使用イメージ】

GROUP BYの使用イメージ

「GROUP BY」句の基本構文

【クエリの基本構文】

SELECT 表示させるカラム名 FROM テーブル名 GROUP BY グループ化するカラム名;

「GROUP BY」句は「FROM」句の後ろに付ける形で記述していきます。このとき、場合によっては「FROM」句と「GROUP BY」句の間に他の句が入ることもありますが、基本的には「GROUP BY」句は「FROM」句より後ろに来るということを覚えておけば大丈夫です。

あなたのご希望に沿った案件が必ず見つかります
【フリーランス向け】高収入好待遇の案件をご紹介

TECH MANIA フリーランス

≫まずは簡単60秒で無料お問い合わせから≪

使用するサンプルテーブル

「GROUP BY」句の具体的な使い方を解説していくにあたって、サンプルとして「テスト」テーブルを用意しました。

「テスト」テーブル

+------+--------+------+------+
| id   | 氏名   | 性別 | 点数 |
+------+--------+------+------+
| 1001 | 秋山   | 男   |  80  |
| 1002 | 久保田 | 女   | 100  |
| 1003 | 佐々木 | 女   |  65  |
| 1004 | 佐藤   | 男   |  75  |
| 1005 | 鈴木   | 女   |  60  |
| 1006 | 田中   | 男   |  90  |
| 1007 | 土屋   | 女   |  55  |
+------+--------+------+------+

【テーブル作成用クエリ】

CREATE TABLE 成績 (
  id   INT PRIMARY KEY,
  氏名 VARCHAR(20),
  性別 CHAR(1),
  点数 INT
);

INSERT INTO 成績 (id, 氏名, 性別, 点数) VALUES
(1001, '秋山',   '男',  80),
(1002, '久保田', '女', 100),
(1003, '佐々木', '女',  65),
(1004, '佐藤',   '男',  75),
(1005, '鈴木',   '女',  60),
(1006, '田中',   '男',  90),
(1007, '土屋',   '女',  55);

GROUP BYと集計関数でグループごとのレコードを集計する

集計関数を使用することで、GROUP BYでグループ化したデータの集計結果を取得することができます。

集計関数とは

集計関数とは、その項目の合計値や平均値を求めたり、あるいはCOUNT関数のようにデータ件数を取得するなど、その名の通り集計を行う関数のことです。これらを利用することで都度計算する必要がなくなり、データ分析などに使うと便利です。後ほど詳しく紹介しますが、集計関数とそれぞれ用途を以下に示しました。

【集計関数の種類と用途】

集計関数用途
COUNT項目のデータ件数を取得する
SUM項目のデータ合計値を取得する
AVG項目のデータ平均値を取得する
MAX項目のデータ最大値を取得する
MIN項目のデータ最小値を取得する

COUNT関数で件数を集計する

「COUNT」関数はグループ化したデータの件数を集計します。「GROUP BY」と併用して、以下の実行クエリでテストを受けた生徒の男女別の人数を求めてみましょう。

【実行クエリ】

SELECT 性別, COUNT(性別) FROM テスト GROUP BY 性別;

【実行結果】

+------+-------------+
| 性別 | COUNT(性別) |
+------+-------------+
| 男   |      3      |
| 女   |      4      |
+------+-------------+

「性別」でグループ化を行い、性別とその数を抽出しています。

このように、「GROUP BY」句と「COUNT」関数を併用すればグループごとのレコード数を集計できます。

ほかにも、この後に説明する「SUM」関数と併用すればグループごとの合計値、「AVG」関数と併用すればグループごとの平均値が求められるので、ほかの関数も試してみてください!

「COUNT」関数についてはこちらのページで詳しく解説していますので、ぜひご覧ください!

SUM関数でデータの合計値を表示する

SUM関数はデータの合計値を算出することができます。

【クエリ例】

SELECT 選択したカラム名, SUM(抽出したカラム名) AS 表示させるカラム名 FROM テーブル名 GROUP BY グループ化するカラム名;

試しに、男女別の合計得点を出してみましょう。

【実行クエリ】

SELECT 性別, SUM(点数) AS 合計得点 FROM test GROUP BY 性別;

【実行結果】

+------+----------+
| 性別 | 合計得点 |
+------+----------+
|  男  |   245    |
|  女  |   280    |
+------+----------+

AVG関数でデータの平均値を表示する

AVG関数はデータの平均値を算出することができます。

試しに、性別ごとの平均点を計算してましょう。

【実行クエリ】

SELECT 性別, AVG(点数) AS 平均点 FROM test GROUP BY 性別;

【実行結果】

+------+---------+
| 性別 | 平均点  |
+------+---------+
|  男  | 81.6667 |
|  女  | 70.0000 |
+------+---------+

平均した際に小数が発生するため、書式を揃えるためにどちらも小数点以下が表示されています。

もし小数を切り捨てたり、あるいは四捨五入したい場合は、以下の関数を使用してください。

小数点以下を切り捨てる場合

小数点以下の値を切り捨てる場合は、TRUNC関数もしくはFLOOR関数を使用します。システムで使用するRDBMSによって関数の名前が異なるので気を付けましょう。

  • TRUNC関数……PostgreSQLやOracleなど
  • FLOOR関数……MySQLやSQL Serverなど

TRUNC/FLOORで構文自体は共通のため、ここではTRUNCのみで説明します。

【基本構文】

-- 小数点第一位で切り捨てる場合
TRUNC(計算する値) AS 表示させるカラム名

-- 小数点第2位で切り捨てる場合
TRUNC(計算する値, 2) AS 表示させるカラム名

小数点以下で四捨五入したい場合

小数点以下を四捨五入する場合は、ROUND関数を使用します。こちらは各RDBMSで共通の関数になっているため、どのデータベースでも使用できます。

【基本構文】

-- 小数点第一位で四捨五入する場合
ROUND(計算する値) AS 表示させるカラム名

-- 小数点第2位で四捨五入する場合
ROUND(計算する値, 2) AS 表示させるカラム名

MAX関数でデータの最大値を抽出する

MAX関数はカラム内のデータの最大値を抽出することができます。

【クエリ例】

SELECT 選択したカラム名, MAX(抽出するカラム名) AS 表示させるカラム名 FROM テーブル名 GROUP BY グループ化するカラム名;

testテーブルから性別ごとの最高得点を抽出してみましょう。

【実行クエリ】

SELECT 性別, MAX(点数) AS 最高得点 FROM test GROUP BY 性別;

【実行結果】

+--------+----------+
|  性別  | 最高得点 |
+--------+----------+
|   男   |    90    |
|   女   |   100    |
+--------+----------+

MIN関数で最小値を抽出する

MIN関数はデータの最小値を抽出することができます。

【実行クエリ】

SELECT 性別, MAX(点数) AS 最高得点 FROM test GROUP BY 性別;

【実行結果】

+------+----------+
| 性別 | 最低得点 |
+------+----------+
|  男  |    75    |
|  女  |    55    |
+------+----------+

「GROUP BY」句を使う際の注意点

GROUP BY句を使用するうえで、いくつか気を付けなければいけない点があります。

列名の指定を統一する

SELECT 表示させるカラム名 FROM テーブル名 GROUP BY グループ化するカラム名;

「GROUP BY」句を使用する際は、対象の「カラム名」と「グループ化を行うカラム名」が同じ列(カラム)である必要があります。「GROUP BY」句で指定するカラムを「集約キー」や「グループ化列」といいます。

【NG例】

SELECT 氏名 FROM テスト GROUP BY 性別;

NULLも1つのグループとして扱われる

指定したカラムに「NULL」値が含まれている場合、全てのNULL値がまとめて1つのグループとして集計されます。これを「NULL値グループ」と言います。

NULLを含みたくない場合は、後述するWHERE句やHAVING句などを使用して除外するようにしましょう。

条件を付けてグループごとのレコード数を取得する

「GROUP BY」句と併せて「WHERE」句または「HAVING」句を使用することで、個別に条件を絞り込むことができます。

テーブルのカラムをグループ化する際、さらに細かく条件を指定して絞り込みたい場合にこれらのクエリを使用します。

「WHERE」句と「HAVING」句の違い

「WHERE」句と「HAVING」句はクエリの実行順序が異なります。「GROUP BY」句と併用する際は、この順序の違いに気を付けながら使用しましょう。

「WHERE」句:「GROUP BY」句の実行前に条件が適応される

「HAVING」句:「GROUP BY」句の実行後に条件が適応される

グループ化の前に任意の条件を満たさないレコードを省く場合は「WHERE」句を使い、グループ化後に任意の条件を満たさないグループを省く場合に「HAVING」句を使います。

「GROUP BY」句と「WHERE」句を併用してグループ化前に絞る

「GROUP BY」句と「WHERE」句の併用例を解説していきます。

先ほどの「テスト」テーブルを用いて、生徒のうちテストの点数が60点未満の生徒を除く人数を男女別で表示させましょう。

「テスト」テーブル

+------+--------+------+------+
| id   | 氏名   | 性別 | 点数 |
+------+--------+------+------+
| 1001 | 秋山   | 男   |  80  |
| 1002 | 久保田 | 女   | 100  |
| 1003 | 佐々木 | 女   |  65  |
| 1004 | 佐藤   | 男   |  75  |
| 1005 | 鈴木   | 女   |  60  |
| 1006 | 田中   | 男   |  90  |
| 1007 | 土屋   | 女   |  55  |
+------+--------+------+------+

【実行クエリ】

SELECT 性別, COUNT(性別) AS 人数 FROM テスト WHERE 点数>=60 GROUP BY 性別;

【実行結果】

+------+------+
| 性別 | 人数 |
+------+------+
| 男   |  3   |
| 女   |  3   |
+------+------+

60点未満の土屋さんが除かれたことで、60点以上の生徒は男子が3名、女子が3名となりました。

また、こちらの記事で「WHERE」句について詳しく解説していますので、ぜひこちらもご覧ください!

「GROUP BY」句と「HAVING」句を併用してグループ化後に絞る

続いて、「GROUP BY」句と「HAVING」句の併用例を解説していきます。

「テスト」テーブルのうち、人数が3人以下のグループのみ表示させましょう。

【実行クエリ】

SELECT 性別, COUNT(性別) AS 人数 FROM テスト GROUP BY 性別 HAVING 4>人数;

【実行結果】

+------+------+
| 性別 | 人数 |
+------+------+
| 男   |  3   |
+------+------+

4人以上のグループが除かれたことで、男子生徒のみが表示されました。

「HAVING」句についてもっと詳しく知りたいという方は、こちらの記事もお読みください!

「ORDER BY」句でグループ化したグループを並び替える

「ORDER BY」句とは

ORDER BY」句とは、任意のカラム(列)に基づいて結果をソート(並び替え)するクエリです。これにより、データの整理や分析を行いやすくなります。

例として、性別ごとまとめたグループを降順で並び替えます。

【実行クエリ】

SELECT 性別, COUNT(性別) AS 人数 FROM テスト GROUP BY 性別 ORDER BY 人数 DESC;

【実行結果】

+------+-------------+
| 性別 | COUNT(性別) |
+------+-------------+
| 女   |      4      |
| 男   |      3      |
+------+-------------+

「ORDER BY」句を併用することで人数の多いチームから少ないチームに並び替えることができました。

クエリの最後に記述している「DESC」は”descending”(下っている)の略称で、「降順」(大きいものから小さいものへ下っていく並び順)を表しています。

反対に、昇順(値が小さいものから大きいものへ)の場合は「ASC」を使用します。こちらは”ascending”(上っている)の略称です。

【応用】GROUP BYとPARTITION BYの使い分け

GROUP BYと似た機能を持つ命令にPARTITION BYというものがあります。この2つはどちらも基準となる条件によってテーブルを分ける働きがありますが、大きな違いがあります。

集計関数とウィンドウ関数

GROUP BYは集計関数を使用する際にデータをまとめて集計する目的で使います。グループごとに1行に結果を集約したものが必要な場合に適しています。

一方で、PARTITION BYはウィンドウ関数を適用する際にデータを分割するために使用します。行ごとの計算や分析を行うケースに適しています。

実行結果の行数

GROUP BYはグループ化を行ったあと1行に集約した結果を返すのに対し、PARTITION BYは元の行数を維持しつつ、各行にウィンドウ関数を適用した結果を表示します。

SQLはクエリの組み立て方によって処理の重さなどが大きく変わります。より最適な処理を行い、最小のコストでクエリが実行できるように、使い分けていきましょう。

SQL関連記事

SQLの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事