【SQL入門編⑧】条件分岐をマスターしよう!

【SQL入門編⑧】条件分岐をマスターしよう!

SQL入門編、いよいよ今回が最後となります。
今日は条件分岐を作れる「CASE文」について勉強しましょう!

CASE文について

CASE文とは

CASE文を使うと、以下のことが可能になります。

「〇〇の場合は△△で、☆☆の場合は××で...」などの条件分岐を作れる

スプレッドシートやエクセルの関数で言う、IF文に近いイメージですね!
具体的な例題と共に、使い方をご説明します!

CASE文の使い方

例題①

以下のユーザーテーブルがあるとします。(purchase_timesは、そのユーザーのこれまでの購入回数を示します。)

idnamegenderagepurchase_timescreated_at
1太郎男性4022022-1-1
2よしお男性3112022-1-1
3SAKI女性3462022-1-2
4れいか女性3022022-1-3
5ジム男性29102022-1-3
6さやか女性3002022-1-3
7ボブ男性3112022-1-4
8健一男性4032022-1-4
usersテーブル

↓ このテーブルの一番右にpurchase_experienceカラムを追加し、ユーザーの購入経験の有無を判別できるようにしたいと思います。

idnamegenderagepurchase_timescreated_atpurchase_experience
1太郎男性4022022-1-1あり
2よしお男性3112022-1-1あり
3SAKI女性3462022-1-2あり
4れいか女性3002022-1-3無し
5ジム男性29102022-1-3あり
6さやか女性3002022-1-3無し
7ボブ男性3112022-1-4あり
8健一男性4032022-1-4あり
一番右に、このようなpurchase_experienceカラムをつけたい

この場合、以下のようなクエリを書きます。

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カラムを追加して、ユーザーの世代を判別可能にしたいと思います。

idnamegenderagepurchase_timescreated_atgeneration
1太郎男性4022022-1-140代
2よしお男性3112022-1-130代
3SAKI女性3462022-1-230代
4れいか女性3002022-1-330代
5ジム男性29102022-1-320代
6さやか女性3002022-1-330代
7ボブ男性3112022-1-430代
8健一男性4032022-1-440代
一番右に、このようなgenerationカラムをつけたい

この場合は、以下のようなクエリとなります。

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"

と書くことで条件を作れます!

例題③

idnamegenderagepurchase_timescreated_at
1太郎男性4022022-1-1
2よしお男性3112022-1-1
3SAKI女性3462022-1-2
4れいか女性3022022-1-3
5ジム男性29102022-1-3
6さやか女性3002022-1-3
7ボブ男性3112022-1-4
8健一男性4032022-1-4
usersテーブル

最後は、先ほどの上記のユーザーテーブルを使い、以下のように登録日別の男性ユーザー数を抽出してみたいと思います。

created_atmale
2022-1-12
2022-1-20
2022-1-31
2022-1-42
登録日別で、男性の登録者数を抽出したい

この場合、以下のようなクエリを書くことで抽出できます。

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カラムの値は紐づくこととします。

iditempurchased_atuser_id
1干し柿2022-1-32
2干し柿2022-1-33
3干し柿まんじゅう2022-1-43
4干し柿2022-1-41
5干し柿まんじゅう2022-1-44
purchasesテーブル
idnamegenderagecreated_at
1太郎男性402022-1-1
2よしお男性312022-1-1
3SAKI女性342022-1-2
4れいか女性302022-1-3
5ジム男性292022-1-3
usersテーブル

終わりに

今回で「SQL入門編」講座は終了です!
いや~本当にお疲れさまでした!

実際にSQLを勉強してみて、いかがだったでしょうか?
今回の「SQL入門編」を通して、皆様にSQLの楽しさが伝わったのなら、執筆者としてこれほど嬉しいことはございません!

さて、今回の講座を通して、皆様はSQLという新たな世界への、大きな大きな一歩を踏み出しました。


SQLというのは英語に似ていて、インプット → アウトプット → インプット → アウトプット の繰り返しによって上達することができます。

今日はぜひ、ご自身や自社のサービスのデータベースから、今一番気になることを、SQLを使ってデータ抽出してみてください。そして、書き方で分からないことが出てきたら、その都度ネットで調べてみて、試行錯誤してみてください。

その繰り返しで、絶対、着実に、SQLが上達していきます。

今後もこのhosigakiブログでは、SQLのことを発信していきますので、また良かったら遊びに来てくださいね!

それでは、また次の記事でお会いしましょう(^^)/

-SQL
-, , , ,