サイトアイコン ITC Media

【簡単】SQL言語でGROUP BYを使う方法を丁寧に解説

(最終更新月:2022年12月)

✔このような方へ向けて書かれた記事となります

「GROUP BYでできることって何?」

「GROUP BYの使い方が知りたい」

「GROUP BYで気を付けることってあるのだろうか?」

✔当記事を通じてお伝えすること

当記事では、SQL言語におけるGROUP BYの使い方はもちろん、GROUP BYが使える実際のケースをコードと一緒に解説しています。

ぜひ最後までご覧ください。

当記事の信頼性

当記事では、Python言語をベースとしたDjangoフレームワークで、アプリの公開方法をご紹介しています。

データの保存場所は、サーバー内で動くpostgreSQL(ポスグレ)です。

Djangoを使えばSQLをマスターしておく必要はないものの、最低限の知識として、かなり勉強しました。

実際のコードや写真付きで、できる限り丁寧に解説します。

※Djangoのチュートリアルはこちら。

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

GROUP BYで知っておくべき基礎知識3選

まずは、GROUP BYの基本事項を確認していきましょう。

具体的な使い方を見る前に、その役割を明確にしておく必要があります

GROUP BYとは?

GROUP BYとは、既存のテーブル内の情報を、グループ化するためのものです。

特定のカラム(列)にある値を使い、レコードをまとめあげます。

例えば、以下のようなものでまとめられるケースがあるでしょう。

より詳しくは具体例をご覧いただきます。

GROUP BYを使った実例

今回用意したテーブルはこちら。

2021年度Jリーグ(サッカー)の得点ランキングです。

nameteamscore
レアンドロ・ダミアン川崎F23
前田大然横浜FM23
古橋亨梧神戸15
上田綺世鹿島14
ディエゴ・オリヴェイラFC東京13
パトリックG大阪13
アンデルソン・ロペス札幌12
オナイウ阿道横浜FM12
チアゴ・サンタナ清水12
荒木遼太郎鹿島10
小林悠川崎F10
レオ・セアラ横浜FM10

こちらはトップ10ランキングなので、トップ10ランキングに所属したチームの一覧を取得してみます。

SELECT team FROM scorer_in_2021 GROUP BY team;
team
鹿島
札幌
横浜FM
清水
FC東京
G大阪
川崎F
神戸

GROUP BYにより、チームをまとめて表示しました。

GROUP BYの基本構成

GROUP BYの書き方として、基本構成をご覧いただきます。

GROUP BY グループ化の基準となるカラム名

グループ化したいカラムごとに以下のようになります。

-- チームでグループ化
GROUP BY team

-- 得点数でグループ化
GROUP BY score

GROUP BYの使い方8つのケース

こちらでは、具体的な使えるケースを8つ見ていきます。

GROUP BYが何なのかを見るだけでは、使いこなせないからです。

SELECTを使って結果を表示する

SELECTを使うことで、結果を表示できます。

SELECT 表示したいカラム名 FROM テーブル名 GROUP BY グループ化の基準となるカラム名

以下が例です。

SELECT team FROM scorer_in_2021 GROUP BY team;
team
鹿島
札幌
横浜FM
清水
FC東京
G大阪
川崎F
神戸

ASを使って任意のラベルを付ける

ASを使うと、カラム名を任意の値にできます。

SELECT team AS チーム名 FROM scorer_in_2021 GROUP BY team;
チーム名
鹿島
札幌
横浜FM
清水
FC東京
G大阪
川崎F
神戸

ASにより、カラム名「team」が、「チーム名」へ変更されました。

COUNTを使って結果の統計を取る

COUNTを使うと、グループ化した際にそれぞれいくつのレコードがあるかを表示できます。

SELECT team AS チーム名, COUNT(team) AS ランク入り選手数 FROM scorer_in_2021 GROUP BY team;
チーム名ランク入り選手数
鹿島2
札幌1
横浜FM3
清水1
FC東京1
G大阪1
川崎F2
神戸1

2021年度は得点ランキングトップ10に、横浜FMの選手が3人いることがわかります。

MAXを使って最大値を取得する

MAXを使うと、グループ化したそれぞれの中での最大値を取得できます。

以下は、チームごとにグループ化し、その中での最高得点を表にしたものです。

SELECT team AS チーム名, MAX(score) AS 最高得点 FROM scorer_in_2021 GROUP BY team;
チーム名最高得点
鹿島14
札幌12
横浜FM23
清水12
FC東京13
G大阪13
川崎F23
神戸15

MINを使って最小値を取得する

MINは、最小値を取得するもの。

各チームでの最小スコアを見てみます。

SELECT team AS チーム名 FROM scorer_in_2021 GROUP BY team;
チーム名最小得点
鹿島10
札幌12
横浜FM10
清水12
FC東京13
G大阪13
川崎F10
神戸15

2つ以上のレコードを持つチームでは、値が変わっているのがわかります。

AVGを使って値の平均値を取得する

AVGを使って、平均値を取得できます。

チームごとの平均点数を見てみましょう。

SELECT team AS チーム名, AVG(score) AS 平均得点 FROM scorer_in_2021 GROUP BY team;
チーム名平均得点
鹿島12
札幌12
横浜FM15
清水12
FC東京13
G大阪13
川崎F16.5
神戸15

SUMを使って値を合計する

SUMを使うと、値を合計できます。

チームの得点を合計した結果が以下のとおり。

SELECT team AS チーム名, SUM(score) AS 合計得点数 FROM scorer_in_2021 GROUP BY team;
チーム名合計得点数
鹿島24
札幌12
横浜FM45
清水12
FC東京13
G大阪13
川崎F33
神戸15

ORDER BYを使ってレコードを並び替える

ORDER BYを使ってレコードを並び替えられます。

上の合計得点表を並び替えましょう。

SELECT team AS チーム名, SUM(score) AS 合計得点数 FROM scorer_in_2021 GROUP BY team ORDER BY SUM(score);
チーム名合計得点数
札幌12
清水12
FC東京13
G大阪13
神戸15
鹿島24
川崎F33
横浜FM45

降順にするには、DESCを追記します。

SELECT team AS チーム名, SUM(score) AS 合計得点数 FROM scorer_in_2021 GROUP BY team ORDER BY SUM(score) DESC;
チーム名合計得点数
横浜FM45
川崎F33
鹿島24
神戸15
FC東京13
G大阪13
清水12
札幌12

GROUP BYで気を付けるべきこと

GROUP BYを使うときに、気を付けるべきことも見ていきましょう。

データベースをいじるときは、注意点まで知った上で実行しなければなりません。

取り出す要素に気を付ける

GROUP BYを使うときは、取り出す要素と表示する要素に気をつけましょう。

その理由は、初心者の方がやりがちなミスだから。

例えば、チームでグループ化をしておきながら、選手名を取り出すなどのことです。

SELECT name AS 選手名 FROM scorer_in_2021 GROUP BY team;

以下のようなエラーとなってしまうので気をつけましょう。

ERROR: column "scorer_in_2021.name" must appear in the GROUP BY clause or be used in an aggregate function Position: 8

NULLの取り扱いを知っておこう

NULLがレコードに含まれる場合、GROUP化の値として扱われます。

例えば、以下のようにNULLが含まれているテーブルの場合でご説明します。

CREATE TABLE scorer_in_2021(
  name varchar(30),
  team varchar(20),
  score integer
);

INSERT INTO scorer_in_2021 (name, team, score) VALUES ('レアンドロ・ダミアン','川崎F',23);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('前田大然','横浜FM',23);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('古橋亨梧','神戸',15);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('オナイウ阿道','横浜FM',12);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('小林悠','川崎F',10);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('レオ・セアラ',NULL,10);

チームごとにグループ化をすると、nullも反映されてしまうのです。

SELECT team AS チーム名, COUNT(team) AS チーム数 FROM scorer_in_2021 GROUP BY team;
チーム名チーム数
(null)0
横浜FM2
川崎F2
神戸1

SQL Fiddle:無料でSQLが実行できるツール

当記事で共有している写真も、SQL Fiddleを使ってご説明しました。

特徴は以下のとおり。

以下のように、左側でテーブルやカラムの設定をおこない、右側でコードが実行できるのです。

SQL言語を学ぶなら、登録してくことをおすすめします!

ちなみに今回のデータベース設定として、SQL Fiddleの左側に書いたコードはこちら。

CREATE TABLE scorer_in_2021(
  name varchar(30),
  team varchar(20),
  score integer
);

INSERT INTO scorer_in_2021 (name, team, score) VALUES ('レアンドロ・ダミアン','川崎F',23);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('前田大然','横浜FM',23);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('古橋亨梧','神戸',15);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('上田綺世','鹿島',14);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('ディエゴ・オリヴェイラ','FC東京',13);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('パトリック','G大阪',13);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('アンデルソン・ロペス','札幌',12);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('オナイウ阿道','横浜FM',12);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('チアゴ・サンタナ','清水',12);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('荒木遼太郎','鹿島',10);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('小林悠','川崎F',10);
INSERT INTO scorer_in_2021 (name, team, score) VALUES ('レオ・セアラ','横浜FM',10);

コピーして活用してください。

まとめ:GROUP BYを使いこなすと、値の取得が簡単

当記事の内容をまとめます。

SQL言語におけるGROUP BYは、データベースに保存したデータを見やすく整理するのに使えます。

使いこなせると、いろいろな場面で活躍できるでしょう。

もし使い方を忘れたときは、いつでも当記事に戻ってきてください。

モバイルバージョンを終了