【SQL入門編⑤】グループごとに抽出してみよう!

【SQL入門編⑤】グループごとに抽出してみよう!

はじめに

前回の記事では、集約関数について勉強しました。
ここで復習も兼ねて、問題です!

以下のusersテーブルの中で、男性の平均年齢女性の平均年齢をそれぞれ抽出するためには、どんなクエリを実行すればよいでしょうか?

idnamegenderagecreated_at
1太郎男性402022-1-1
2よしお男性312022-1-1
3SAKI女性342022-1-2
4れいか女性302022-1-3
5ジム男性292022-1-3
usersテーブル

...恐らく、前回の記事を読んでくださった方は、以下2つのクエリをそれぞれ実行することを考えたのではないでしょうか?

SELECT
    AVG(age)
FROM
    users
WHERE
    gender = "男性"
SELECT
    AVG(age)
FROM
    users
WHERE
    gender = "女性"

これはもちろん正解です!
が、実はこれ、1つのクエリ抽出することができるんです!

今日は、SQLを学習する上で避けては通れない「グループごとに抽出する」ことについて勉強しましょう!

グループごとの抽出方法

抽出手順は、以下になります。

①抽出するテーブルを選択
②レコードをグループごとに分ける
③各グループごとに、平均年齢を算出する

①抽出するテーブルを選択

idnamegenderagecreated_at
1太郎男性402022-1-1
2よしお男性312022-1-1
3SAKI女性342022-1-2
4れいか女性302022-1-3
5ジム男性292022-1-3
usersテーブル

抽出先のテーブルは、 FROM テーブル名 と書くことで選択できましたね!
クエリは次のようになります。

FROM
    users

②レコードをグループごとに分ける

先ほど選んだusersテーブルを、以下のように男性グループと女性グループに分けます。

idnamegenderagecreated_at
1太郎男性402022-1-1
2よしお男性312022-1-1
5ジム男性292022-1-3
男性グループのレコード
idnamegenderagecreated_at
3SAKI女性342022-1-2
4れいか女性302022-1-3
女性グループのレコード

クエリで書くと、以下のようになります。

FROM
    users
GROUP BY
    gender

さて、新たにGROUP BY という単語が出てきました。
(GROUP BY とは、「~によってレコードを分割して、グループ化する」という意味)

上記のようにレコードをグループ分けしたいときは、GROUP BY を使うことになります。

GROUP BY の使い方

GROUP BY カラム名と書くことで、そのカラム名の値ごとにレコードが分割されて、グループが作られます。

今回のケースで言えば、GROUP BY gender と書くことで、genderカラムの値によってレコードが分割されて、上記の図のように、男性グループと女性グループができあがります!

③各グループごとに、平均年齢を算出する

前回の記事では、集約関数(あるカラムの値を集めて、一つの集約値を出す関数)について勉強しましたね!

今回は「平均年齢」を出したいので、AVG関数を使用します。

SELECT
    AVG(age)
FROM
    users
GROUP BY
    gender

このクエリを実行した結果、以下のデータが抽出されます。

f0_
33.333
32
上記クエリの抽出結果

ひとまず平均年齢の抽出はできました!
ただ、これだと次のような問題がありますね。

・ラベルが「平均年齢」ではなく「f0_」となっていて、分かりづらい
・どっちが男性の平均年齢で、どっちが女性の平均年齢かが分かりづらい

■自分の好きなラベル名をつけよう

SQLでは、抽出する値の後ろに AS 好きなラベル名 と書くことで、自分の好きなラベル名をつけることができます。

SELECT
    AVG(age) AS average_age
FROM
    users
GROUP BY
    gender
average_age
33.333
32
上記クエリの抽出結果

これで、ラベル名が分かりやすくなりましたね!

■グループ名を表示しよう

SELECT句に、GROUP BY で指定したカラムと同じカラムを書くことで、グループ名をつけることができます。

今回はGROUP BY句でgenderカラムを指定しているので、SELECT句にもgenderカラムを追加します。

SELECT
    gender,
    AVG(age) AS average_age
FROM
    users
GROUP BY
    gender
genderaverage_age
男性33.333
女性32
上記クエリの抽出結果

これで、それぞれの平均年齢がどちらのグループか、分かりやすくなりましたね!

これで、GROUP BYの使い方は以上です!
次の練習問題で、しっかりアウトプットして、GROUP BY を習得しましょう!

練習問題

idnamegenderagecreated_at
1太郎男性402022-1-1
2よしお男性312022-1-1
3SAKI女性342022-1-2
4れいか女性302022-1-3
5ジム男性292022-1-3
6さやか女性302022-1-3
7ボブ男性312022-1-4
8健一男性402022-1-4
usersテーブル

練習問題①

usersテーブルから、性別ごとのユーザー数を抽出するクエリを書いてください。ただし、抽出時はユーザー数のラベル名を「num_of_users」にしてください。

練習問題②

usersテーブルから、登録日(created_at)ごとの登録ユーザー数を抽出するクエリを書いてください。ただし、抽出時はユーザー数のラベル名を「num_of_users」にしてください。

練習問題③

usersテーブルから、男性の登録日別の平均年齢を抽出するクエリを書いてください。ただし、抽出時はユーザー数のラベル名を「average_age_of_male」にしてください。

ここまで読んでいただき、ありがとうございました!
(GROUP BY句のちょっとしたテクニックをこちらの記事でまとめていますので、発展編として読んでいただくと、よりGROUP BYの理解が深まります!)


それでは、また次の記事でお会いできるのを楽しみにしております(^^)/

-SQL
-, , , , , , ,