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
users
BETWEEN構文の使い方
カラム名 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のことを発信していきますので、また良かったら遊びに来てくださいね!
それでは、また次の記事でお会いしましょう(^^)/