(最終更新月: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リーグ(サッカー)の得点ランキングです。
name | team | score |
---|---|---|
レアンドロ・ダミアン | 川崎F | 23 |
前田大然 | 横浜FM | 23 |
古橋亨梧 | 神戸 | 15 |
上田綺世 | 鹿島 | 14 |
ディエゴ・オリヴェイラ | FC東京 | 13 |
パトリック | G大阪 | 13 |
アンデルソン・ロペス | 札幌 | 12 |
オナイウ阿道 | 横浜FM | 12 |
チアゴ・サンタナ | 清水 | 12 |
荒木遼太郎 | 鹿島 | 10 |
小林悠 | 川崎F | 10 |
レオ・セアラ | 横浜FM | 10 |
こちらはトップ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 |
横浜FM | 3 |
清水 | 1 |
FC東京 | 1 |
G大阪 | 1 |
川崎F | 2 |
神戸 | 1 |
2021年度は得点ランキングトップ10に、横浜FMの選手が3人いることがわかります。
MAXを使って最大値を取得する
MAXを使うと、グループ化したそれぞれの中での最大値を取得できます。
以下は、チームごとにグループ化し、その中での最高得点を表にしたものです。
SELECT team AS チーム名, MAX(score) AS 最高得点 FROM scorer_in_2021 GROUP BY team;
チーム名 | 最高得点 |
---|---|
鹿島 | 14 |
札幌 | 12 |
横浜FM | 23 |
清水 | 12 |
FC東京 | 13 |
G大阪 | 13 |
川崎F | 23 |
神戸 | 15 |
MINを使って最小値を取得する
MINは、最小値を取得するもの。
各チームでの最小スコアを見てみます。
SELECT team AS チーム名 FROM scorer_in_2021 GROUP BY team;
チーム名 | 最小得点 |
---|---|
鹿島 | 10 |
札幌 | 12 |
横浜FM | 10 |
清水 | 12 |
FC東京 | 13 |
G大阪 | 13 |
川崎F | 10 |
神戸 | 15 |
2つ以上のレコードを持つチームでは、値が変わっているのがわかります。
AVGを使って値の平均値を取得する
AVGを使って、平均値を取得できます。
チームごとの平均点数を見てみましょう。
SELECT team AS チーム名, AVG(score) AS 平均得点 FROM scorer_in_2021 GROUP BY team;
チーム名 | 平均得点 |
---|---|
鹿島 | 12 |
札幌 | 12 |
横浜FM | 15 |
清水 | 12 |
FC東京 | 13 |
G大阪 | 13 |
川崎F | 16.5 |
神戸 | 15 |
SUMを使って値を合計する
SUMを使うと、値を合計できます。
チームの得点を合計した結果が以下のとおり。
SELECT team AS チーム名, SUM(score) AS 合計得点数 FROM scorer_in_2021 GROUP BY team;
チーム名 | 合計得点数 |
---|---|
鹿島 | 24 |
札幌 | 12 |
横浜FM | 45 |
清水 | 12 |
FC東京 | 13 |
G大阪 | 13 |
川崎F | 33 |
神戸 | 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 |
川崎F | 33 |
横浜FM | 45 |
降順にするには、DESCを追記します。
SELECT team AS チーム名, SUM(score) AS 合計得点数 FROM scorer_in_2021 GROUP BY team ORDER BY SUM(score) DESC;
チーム名 | 合計得点数 |
---|---|
横浜FM | 45 |
川崎F | 33 |
鹿島 | 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 |
横浜FM | 2 |
川崎F | 2 |
神戸 | 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は、データベースに保存したデータを見やすく整理するのに使えます。
使いこなせると、いろいろな場面で活躍できるでしょう。
もし使い方を忘れたときは、いつでも当記事に戻ってきてください。