SQL入門編、いよいよ今回が最後となります。
今日は条件分岐を作れる「CASE文」について勉強しましょう!
CASE文について
CASE文とは
CASE文を使うと、以下のことが可能になります。
「〇〇の場合は△△で、☆☆の場合は××で...」などの条件分岐を作れる
スプレッドシートやエクセルの関数で言う、IF文に近いイメージですね!
具体的な例題と共に、使い方をご説明します!
CASE文の使い方
例題①
以下のユーザーテーブルがあるとします。(purchase_timesは、そのユーザーのこれまでの購入回数を示します。)
| id | name | gender | age | purchase_times | created_at |
|---|---|---|---|---|---|
| 1 | 太郎 | 男性 | 40 | 2 | 2022-1-1 |
| 2 | よしお | 男性 | 31 | 1 | 2022-1-1 |
| 3 | SAKI | 女性 | 34 | 6 | 2022-1-2 |
| 4 | れいか | 女性 | 30 | 2 | 2022-1-3 |
| 5 | ジム | 男性 | 29 | 10 | 2022-1-3 |
| 6 | さやか | 女性 | 30 | 0 | 2022-1-3 |
| 7 | ボブ | 男性 | 31 | 1 | 2022-1-4 |
| 8 | 健一 | 男性 | 40 | 3 | 2022-1-4 |
↓ このテーブルの一番右にpurchase_experienceカラムを追加し、ユーザーの購入経験の有無を判別できるようにしたいと思います。
| id | name | gender | age | purchase_times | created_at | purchase_experience |
|---|---|---|---|---|---|---|
| 1 | 太郎 | 男性 | 40 | 2 | 2022-1-1 | あり |
| 2 | よしお | 男性 | 31 | 1 | 2022-1-1 | あり |
| 3 | SAKI | 女性 | 34 | 6 | 2022-1-2 | あり |
| 4 | れいか | 女性 | 30 | 0 | 2022-1-3 | 無し |
| 5 | ジム | 男性 | 29 | 10 | 2022-1-3 | あり |
| 6 | さやか | 女性 | 30 | 0 | 2022-1-3 | 無し |
| 7 | ボブ | 男性 | 31 | 1 | 2022-1-4 | あり |
| 8 | 健一 | 男性 | 40 | 3 | 2022-1-4 | あり |
この場合、以下のようなクエリを書きます。
SELECT
*,
CASE
WHEN purchase_times >= 1 THEN "あり"
ELSE "無し"
END AS purchase_experience
FROM
users注目していただきたいのは、SELECT句の2〜3行目にある「CASE WHEN...」の部分です!
「purchase_timesカラムの値が1以上の値なら『あり』、それ以外の値なら『無し』という値にする」
という作業を行い、purchase_experienceカラムと値を作成しています。
CASE文の書き方
CASE
WHEN 条件1 THEN 条件1を満たした際につけたい値
WHEN 条件2 THEN 条件2を満たした際につけたい値
....
ELSE 上記のいずれの条件も満たさなかった際につけたい値
END AS つけたいカラム名(3つ以上の分岐を作りたい場合は、どんどんWHENを書き足していくことで、分岐が作れます)
例題②
今度は先ほどのテーブルに、generationカラムを追加して、ユーザーの世代を判別可能にしたいと思います。
| id | name | gender | age | purchase_times | created_at | generation |
|---|---|---|---|---|---|---|
| 1 | 太郎 | 男性 | 40 | 2 | 2022-1-1 | 40代 |
| 2 | よしお | 男性 | 31 | 1 | 2022-1-1 | 30代 |
| 3 | SAKI | 女性 | 34 | 6 | 2022-1-2 | 30代 |
| 4 | れいか | 女性 | 30 | 0 | 2022-1-3 | 30代 |
| 5 | ジム | 男性 | 29 | 10 | 2022-1-3 | 20代 |
| 6 | さやか | 女性 | 30 | 0 | 2022-1-3 | 30代 |
| 7 | ボブ | 男性 | 31 | 1 | 2022-1-4 | 30代 |
| 8 | 健一 | 男性 | 40 | 3 | 2022-1-4 | 40代 |
この場合は、以下のようなクエリとなります。
SELECT
*,
CASE
WHEN age >= 20 AND age <=29 then "20代"
WHEN age >= 30 AND age <=39 then "30代"
WHEN age >= 40 AND age <=49 then "40代"
ELSE "その他"
END AS generation
FROM
usersこのCASE文では、次のように条件分岐し、generationカラムの値として抽出しています。
ageカラムの値が20以上 かつageカラムの値が29以下なら、「20代」という値ageカラムの値が30以上 かつageカラムの値が39以下なら、「30代」という値ageカラムの値が40以上 かつageカラムの値が49以下なら、「40代」という値
各分岐の中では、「AND」をつけることで、条件を複数設定することが可能です!
ちなみに、「〇〇以上△△以下」という条件は、以下のように「BETWEEN 〇〇 AND △△」という構文でも代用できるので、覚えておくと便利ですよ!
SELECT
*,
CASE
WHEN age BETWEEN 20 AND 29 then "20代"
WHEN age BETWEEN 30 AND 39 then "30代"
WHEN age BETWEEN 40 AND 49 then "40代"
ELSE "その他"
END AS generation
FROM
usersBETWEEN構文の使い方
カラム名 BETWEEN 〇〇 AND △△ちなみに、〇〇と△△には、数字だけではなく日時も入れることが可能です!
例えば、「created_atカラムの値が2022年1月1日から2022年1月3日」という条件を作りたい場合は、
created_at BETWEEN "2022-1-1" AND "2022-1-3"と書くことで条件を作れます!
例題③
| id | name | gender | age | purchase_times | created_at |
|---|---|---|---|---|---|
| 1 | 太郎 | 男性 | 40 | 2 | 2022-1-1 |
| 2 | よしお | 男性 | 31 | 1 | 2022-1-1 |
| 3 | SAKI | 女性 | 34 | 6 | 2022-1-2 |
| 4 | れいか | 女性 | 30 | 2 | 2022-1-3 |
| 5 | ジム | 男性 | 29 | 10 | 2022-1-3 |
| 6 | さやか | 女性 | 30 | 0 | 2022-1-3 |
| 7 | ボブ | 男性 | 31 | 1 | 2022-1-4 |
| 8 | 健一 | 男性 | 40 | 3 | 2022-1-4 |
最後は、先ほどの上記のユーザーテーブルを使い、以下のように登録日別の男性ユーザー数を抽出してみたいと思います。
| created_at | male |
|---|---|
| 2022-1-1 | 2 |
| 2022-1-2 | 0 |
| 2022-1-3 | 1 |
| 2022-1-4 | 2 |
この場合、以下のようなクエリを書くことで抽出できます。
SELECT
created_at,
SUM(
CASE
WHEN gender = "男性" THEN 1
ELSE 0
END
) AS "male"
FROM
users
GROUP BY
created_atここでは、以下の処理を行っています。
①FROM句でusersテーブルを選択
↓
②GROUP BY句でcreated_atカラムの値ごとにグループを作る
↓
③SELECT句で各グループのラベル名としてcreated_atを抽出。
同時に、SUM関数で各グループの男性登録者数を算出(★)し、抽出。
※ GROUP BY句はこちらの記事、SUM関数はこちらの記事で紹介しているので、もし忘れていたら、ぜひ参照してみてください!
さて、今回は日別の男性登録者数を出すのが目的でしたね。
上記の★の処理でCASE文が用いられているため、ここをもう少し詳しく見ていきましょう。
実は、各グループごとに、SUM関数内で以下の処理を行っています。
CASE文によって以下のように条件分岐
genderカラムの値が「男性」という値 → 1という値を出力genderカラムの値がそれ以外の値 → 0という値を出力
例)created_atが2022-1-3のグループには、女性、男性、女性の3名が存在します。
この時、CASE文によって、「0, 1, 0」という値が算出されています。
このように、グループごとにSUM関数内で、CASE文を使って1か0の数字の集まりを作っているんです。
その数字の集まりを合算することで、男性の登録者数が抽出できます!
それでは、練習問題を解いてみましょう!
練習問題
以下二つのテーブルを使って、商品別の男性購入数と女性購入数を抽出するクエリを書いてください。ただし、purchasesテーブルのuser_idカラムの値と、usersテーブルのidカラムの値は紐づくこととします。
| id | item | purchased_at | user_id |
|---|---|---|---|
| 1 | 干し柿 | 2022-1-3 | 2 |
| 2 | 干し柿 | 2022-1-3 | 3 |
| 3 | 干し柿まんじゅう | 2022-1-4 | 3 |
| 4 | 干し柿 | 2022-1-4 | 1 |
| 5 | 干し柿まんじゅう | 2022-1-4 | 4 |
| 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 |
終わりに
今回で「SQL入門編」講座は終了です!
いや~本当にお疲れさまでした!
実際にSQLを勉強してみて、いかがだったでしょうか?
今回の「SQL入門編」を通して、皆様にSQLの楽しさが伝わったのなら、執筆者としてこれほど嬉しいことはございません!
さて、今回の講座を通して、皆様はSQLという新たな世界への、大きな大きな一歩を踏み出しました。
SQLというのは英語に似ていて、インプット → アウトプット → インプット → アウトプット の繰り返しによって上達することができます。
今日はぜひ、ご自身や自社のサービスのデータベースから、今一番気になることを、SQLを使ってデータ抽出してみてください。そして、書き方で分からないことが出てきたら、その都度ネットで調べてみて、試行錯誤してみてください。
その繰り返しで、絶対、着実に、SQLが上達していきます。
今後もこのhosigakiブログでは、SQLのことを発信していきますので、また良かったら遊びに来てくださいね!
それでは、また次の記事でお会いしましょう(^^)/