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

SQL

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

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

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

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

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

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

  • SQLのGROUP BYについての基礎知識
  • GROUP BYが使えるケース
  • GROUP BYを使う際の注意点

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

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

当記事の信頼性

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

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

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

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

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

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

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

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

  • GROUP BYとは?
  • GROUP BYを使った実例
  • 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を使って結果を表示する
  • ASを使って任意のラベルを付ける
  • COUNTを使って結果の統計を取る
  • MAXを使って最大値を取得する
  • MINを使って最小値を取得する
  • AVGを使って値の平均値を取得する
  • SUMを使って値を合計する
  • ORDER 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を使うときに、気を付けるべきことも見ていきましょう。

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

  • 取り出す要素に気を付ける
  • NULLの取り扱いを知っておこう

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

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言語を学ぶなら、登録してくことをおすすめします!

ちなみに今回のデータベース設定として、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を使いこなすと、値の取得が簡単

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

  • GROUP BYは、レコードをグループ化したいときに使えるもの
  • GROUP BYは、ほかのコマンドと組み合わせると応用した使い方ができる
  • GROUP BYは、初心者がやりがちなミスに気をつけて使おう

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

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

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

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

「Djangoで開発したアプリをWebで公開するにはどうするの?」

✔当ブログ掲載の記事

  • Djangoで作る日報アプリ開発
  • WebアプリをWeb上に公開する方法
  • Webアプリ開発に必要なそのほかの情報
【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。

ITCへ投げ銭をする

タイトルとURLをコピーしました