【SQL入門編⑥】テーブルを結合しよう!その1

【SQL入門編⑥】テーブルを結合しよう!その1

この記事では、データ分析の際に欠かせない、「テーブルの結合」について勉強していきます!

テーブルの結合について

そもそもテーブルの結合って何?

テーブルの結合とは

テーブル同士を合体させることで、一つのテーブルを作るということ

テーブルの結合をすることで、それまでのテーブルだけじゃ分からなかった、有益な情報が分析できるようになるというメリットがあります!

テーブルの結合のイメージを持とう!

今回は、以下二つのテーブルを結合させることで、どの商品をどんなユーザーが購入したかを分析してみたいと思います。

結合させるテーブル
・ユーザーの購入履歴が分かるpurchasesテーブル
・ユーザー情報が分かるusersテーブル

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テーブル

puchasesテーブルのuser_idカラムは、usersテーブルのidカラムと紐づくように設計されています。そのため、以下のようにuser_id = id になるようにテーブル同士を結合させることが可能です。

iditempurchased_atuser_ididnamegenderagecreated_at
1干し柿2022-1-322よしお男性312022-1-1
2干し柿2022-1-333SAKI女性342022-1-2
3干し柿まんじゅう2022-1-433SAKI女性342022-1-2
4干し柿2022-1-411太郎男性402022-1-1
5干し柿まんじゅう2022-1-444れいか女性302022-1-3
purchasesテーブル に usersテーブルを結合

↑ 左4列が元purchasesテーブル、右5列が元usersテーブルですね。

二つのテーブルが結合されたことで、

・干し柿まんじゅうは2名の女性から買われている
・どのユーザーも登録日には何も買っていない

などの新しい分析が可能になりましたね!

SQLでテーブルを結合してみよう!

先ほどのpurchasesテーブルとusersテーブルの結合を、SQLで行ってみましょう!

元となるテーブルを選ぶ

まずは、結合前の元となるテーブルを選びます。
ここではpurchasesテーブルを選択しましょう。

FROM
    purchases

結合させたいテーブルを選ぶ

purchasesテーブルの右側に結合させるテーブルを選びます。
今回はusersテーブルを選択します。

FROM
    purchases
    INNER JOIN users
        ON purchases.user_id = users.id

新しく「INNER JOIN」と「ON」の2つの単語が出てきましたね。順に詳しく見ていきましょう!

INNER JOIN で結合テーブルを宣言

元となるテーブル名 INNER JOIN 結合させたいテーブル名と書くことで、どのテーブル同士を結合させるかを宣言しています。

今回の場合は、purchasesテーブルにusersテーブルを結合させたいので、purchases INNER JOIN users という書き方になります!

ON で結合条件を宣言

ON 結合条件 と書くことで、二つのテーブルの結合条件を宣言しています。
ONの後ろは、どのテーブルのどのカラムなのかを明らかにするために、テーブル名.カラム名 と書く必要があります。

コラム

~テーブル名を書かないとエラーになる??

例えば、idカラムは、puchasesテーブルとusersテーブル、どちらにも存在しています。

もしクエリ上で ON user_id = id と書いてしまうと、データベースはidカラムがどちらのテーブルのものか分からなくなってしまうため、エラーが発生します。

こういったエラーを避けるためにも、テーブルを結合する際は、テーブル名.カラム名と書く癖をつけておきましょう!

抽出したいデータを選択しよう

STEP2の結果、2つのテーブルが結合され、以下のテーブルができました!

iditempurchased_atuser_ididnamegenderagecreated_at
1干し柿2022-1-322よしお男性312022-1-1
2干し柿2022-1-333SAKI女性342022-1-2
3干し柿まんじゅう2022-1-433SAKI女性342022-1-2
4干し柿2022-1-411太郎男性402022-1-1
5干し柿まんじゅう2022-1-444れいか女性302022-1-3
結合で生まれた新たなテーブル

あとはこのテーブルから何を抽出するかを決めればよいですね!
今回は、このテーブルの左から順に「id」「item」「id」「gender」「age」の五つのカラムの値を抽出するとしましょう。


この場合、以下のようにSELECT句で元テーブル名.カラム名を指定します。

SELECT
    purchases.id,
    purchases.item,
    users.id,
    users.gender,
    users.age
FROM
    purchases
    INNER JOIN users
        ON purchases.user_id = users.id

このクエリを実行すると、以下のような結果が抽出されます!

iditemidgenderage
1干し柿2男性31
2干し柿3女性34
3干し柿まんじゅう3女性34
4干し柿1男性40
5干し柿まんじゅう4女性30
上記クエリの抽出結果

ちなみに、先ほどの結合で生まれたテーブルは、通常のテーブルと同様、WHERE句で絞り込んだり、GROUP BY句でグループ化することも可能です!

以下それぞれのクエリと抽出結果の例を挙げますので、「こんな書き方もできるんだ~」というのを感じていただければ嬉しいです!

■ 結合したテーブルを「干し柿まんじゅう」のレコードだけに絞ってみる

SELECT
    *
FROM
    purchases
    INNER JOIN users
        ON purchases.user_id = users.id
WHERE
    purchases.item = "干し柿まんじゅう"
iditempurchased_atuser_ididnamegenderagecreated_at
3干し柿まんじゅう2022-1-433SAKI女性342022-1-2
5干し柿まんじゅう2022-1-444れいか女性302022-1-3
上記クエリの抽出結果

■ 結合したテーブルで、商品ごとの購入者の平均年齢を出してみる

SELECT
    purchases.item,
    AVG(users.age) AS average_age
FROM
    purchases
    INNER JOIN users
        ON purchases.user_id = users.id
GROUP BY
    item
itemaverage_age
干し柿35
干し柿まんじゅう32
上記クエリの抽出結果

それでは、これまでの復習も兼ねて、練習問題にトライしてみましょう!

練習問題

練習問題①

以下二つのテーブルを使って、商品ごとの女性購入者数を抽出するクエリを書いてください。ただし、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テーブル

練習問題②

以下二つのテーブルを使って、日別の売上合計を抽出するクエリを書いてください。ただし、purchasesテーブルのitem_idカラムの値とitemsテーブルのidカラムの値は紐づくこととします。

iditem_idpurchased_at
112022-1-1
232022-1-1
312022-1-1
412022-1-2
542022-1-3
purchasesテーブル
idnameprice
1干し柿1000
2干し柿まんじゅう1200
3干し柿ジュース800
4幻の干し柿3000
itemsテーブル

お疲れ様でした!ちょっと難しかったでしょうか?

テーブルの結合ができるようになると、これまで以上にデータ分析の幅が広がるため、くじけずに一緒に頑張って乗り越えましょう!

-SQL
-, , , , ,