目次
はじめに
前回の記事では、集約関数について勉強しました。
ここで復習も兼ねて、問題です!
以下のusersテーブルの中で、男性の平均年齢と女性の平均年齢をそれぞれ抽出するためには、どんなクエリを実行すればよいでしょうか?
id | name | gender | age | created_at |
---|---|---|---|---|
1 | 太郎 | 男性 | 40 | 2022-1-1 |
2 | よしお | 男性 | 31 | 2022-1-1 |
3 | SAKI | 女性 | 34 | 2022-1-2 |
4 | れいか | 女性 | 30 | 2022-1-3 |
5 | ジム | 男性 | 29 | 2022-1-3 |
...恐らく、前回の記事を読んでくださった方は、以下2つのクエリをそれぞれ実行することを考えたのではないでしょうか?
SELECT
AVG(age)
FROM
users
WHERE
gender = "男性"
SELECT
AVG(age)
FROM
users
WHERE
gender = "女性"
これはもちろん正解です!
が、実はこれ、1つのクエリ抽出することができるんです!
今日は、SQLを学習する上で避けては通れない「グループごとに抽出する」ことについて勉強しましょう!
グループごとの抽出方法
抽出手順は、以下になります。
①抽出するテーブルを選択
②レコードをグループごとに分ける
③各グループごとに、平均年齢を算出する
①抽出するテーブルを選択
id | name | gender | age | created_at |
---|---|---|---|---|
1 | 太郎 | 男性 | 40 | 2022-1-1 |
2 | よしお | 男性 | 31 | 2022-1-1 |
3 | SAKI | 女性 | 34 | 2022-1-2 |
4 | れいか | 女性 | 30 | 2022-1-3 |
5 | ジム | 男性 | 29 | 2022-1-3 |
抽出先のテーブルは、 FROM テーブル名
と書くことで選択できましたね!
クエリは次のようになります。
FROM
users
②レコードをグループごとに分ける
先ほど選んだusersテーブルを、以下のように男性グループと女性グループに分けます。
id | name | gender | age | created_at |
---|---|---|---|---|
1 | 太郎 | 男性 | 40 | 2022-1-1 |
2 | よしお | 男性 | 31 | 2022-1-1 |
5 | ジム | 男性 | 29 | 2022-1-3 |
id | name | gender | age | created_at |
---|---|---|---|---|
3 | SAKI | 女性 | 34 | 2022-1-2 |
4 | れいか | 女性 | 30 | 2022-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
gender | average_age |
---|---|
男性 | 33.333 |
女性 | 32 |
これで、それぞれの平均年齢がどちらのグループか、分かりやすくなりましたね!
これで、GROUP BYの使い方は以上です!
次の練習問題で、しっかりアウトプットして、GROUP BY を習得しましょう!
練習問題
id | name | gender | age | created_at |
---|---|---|---|---|
1 | 太郎 | 男性 | 40 | 2022-1-1 |
2 | よしお | 男性 | 31 | 2022-1-1 |
3 | SAKI | 女性 | 34 | 2022-1-2 |
4 | れいか | 女性 | 30 | 2022-1-3 |
5 | ジム | 男性 | 29 | 2022-1-3 |
6 | さやか | 女性 | 30 | 2022-1-3 |
7 | ボブ | 男性 | 31 | 2022-1-4 |
8 | 健一 | 男性 | 40 | 2022-1-4 |
練習問題①
usersテーブルから、性別ごとのユーザー数を抽出するクエリを書いてください。ただし、抽出時はユーザー数のラベル名を「num_of_users」にしてください。
練習問題②
usersテーブルから、登録日(created_at)ごとの登録ユーザー数を抽出するクエリを書いてください。ただし、抽出時はユーザー数のラベル名を「num_of_users」にしてください。
練習問題③
usersテーブルから、男性の登録日別の平均年齢を抽出するクエリを書いてください。ただし、抽出時はユーザー数のラベル名を「average_age_of_male」にしてください。
ここまで読んでいただき、ありがとうございました!
(GROUP BY句のちょっとしたテクニックをこちらの記事でまとめていますので、発展編として読んでいただくと、よりGROUP BYの理解が深まります!)
それでは、また次の記事でお会いできるのを楽しみにしております(^^)/