前回の記事では、データ分析の際に欠かせない「テーブルの結合」について勉強しました。
実は、テーブルの結合方法には何種類があり、使い分けることで分析がぐっと楽になります!
ということで、今日はテーブルの結合方法を押さえましょう!
目次
結合方法の種類
データ分析時は、以下の2種類の結合方法を知っておけば問題ありません!
INNER JOIN
前回の記事で登場しましたね!
以下のようなクエリを書くことで、INNER JOINでテーブルを結合できます!
SELECT
*
FROM
テーブルA
INNER JOIN テーブルB
ON 結合条件
INNER JOINの結合時、テーブルBからON以降の結合条件に合致するレコードが検索されて、テーブルAにくっつきます。
テーブルBのレコードがくっつかなかったテーブルAのレコード(図の水色のレコード)は、除外されます。
LEFT OUTER JOIN
LEFT OUTER JOINは、今回初登場の結合方法ですね。
クエリの書き方は、INNER JOIN と同じです!
SELECT
*
FROM
テーブルA
LEFT OUTER JOIN テーブルB
ON 結合条件
INNER JOIN との違いは、最後にテーブルAのレコードは除外されないという点です。
図のように、結合時にテーブルAの水色のレコードには、テーブルBのレコードはくっつきませんが、結合後もテーブルAの水色のレコードが残っています。
ポイント
テーブルAの中で、テーブルBのレコードが結合されなかったレコードは...
INNER JOINで結合した場合 → 除外されるLEFT OUTER JOINで結合した場合 → 残る
すこし抽象的な話でまだイメージがしづらいと思うので、次は具体的なそれぞれの使い方を見ていきましょう!
結合方法を使い分けてみよう!
今回は、以下二つのテーブルを元に使い分けを説明します。
なお、purchases.user_id と users.idはそれぞれ紐づきます。
| 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 |
| id | item | purchased_at | user_id |
|---|---|---|---|
| 1 | 干し柿 | 2022-1-3 | 2 |
| 2 | 干し柿 | 2022-1-4 | 1 |
| 3 | 干し柿まんじゅう | 2022-1-4 | 4 |
商品購入者の「id」,「名前」,「購入した商品名」を調べたい時
そんな時は、以下のようにINNER JOINを使います!
これによって、商品を購入していない人のレコードが除外され、商品購入者だけのレコードが抽出されます!
SELECT
users.id,
users.name,
purchases.item
FROM
users
INNER JOIN purchases
ON users.id = purchases.user_id■抽出までの流れ
| id | name | gender | age | created_at | id | item | purchased_at | user_id |
|---|---|---|---|---|---|---|---|---|
| 1 | 太郎 | 男性 | 40 | 2022-1-1 | 2 | 干し柿 | 2022-1-4 | 1 |
| 2 | よしお | 男性 | 31 | 2022-1-1 | 1 | 干し柿 | 2022-1-3 | 2 |
| 4 | れいか | 女性 | 30 | 2022-1-3 | 3 | 干し柿まんじゅう | 2022-1-4 | 4 |
↓ users.id, users.name, purchases.itemの3つを抽出
| id | name | item |
|---|---|---|
| 1 | 太郎 | 干し柿 |
| 2 | よしお | 干し柿 |
| 4 | れいか | 干し柿まんじゅう |
まだ何も購入したことがないユーザーのIDと名前を調べたい時
次は、先ほどと違って、商品を購入していない人のレコードが必要になります。
この場合、以下のようにLEFT OUTER JOINを使います!
SELECT
users.id,
users.name
FROM
users
LEFT OUTER JOIN purchases
ON users.id = purchases.user_id
WHERE
purchases.user_id IS NULL■抽出までの流れ
| id | name | gender | age | created_at | id | item | purchased_at | user_id |
|---|---|---|---|---|---|---|---|---|
| 1 | 太郎 | 男性 | 40 | 2022-1-1 | 2 | 干し柿 | 2022-1-4 | 1 |
| 2 | よしお | 男性 | 31 | 2022-1-1 | 1 | 干し柿 | 2022-1-3 | 2 |
| 3 | SAKI | 女性 | 34 | 2022-1-2 | ||||
| 4 | れいか | 女性 | 30 | 2022-1-3 | 3 | 干し柿まんじゅう | 2022-1-4 | 4 |
| 5 | ジム | 男性 | 29 | 2022-1-3 |
↓ WHERE句で、purchases.id IS NULL(← purchases.idの値が空白 という意味)のレコードのみに絞る
| id | name | gender | age | created_at | id | item | purchased_at | user_id |
|---|---|---|---|---|---|---|---|---|
| 3 | SAKI | 女性 | 34 | 2022-1-2 | ||||
| 5 | ジム | 男性 | 29 | 2022-1-3 |
↓ users.id, users.nameの2つを抽出
| id | name |
|---|---|
| 3 | SAKI |
| 5 | ジム |
「NULL」って何?
NULLとは「空」という意味で、レコードの値の部分に値がない状態のことを指します。
上記のように、LEFT OUTER JOINを行うことで、新しくできたテーブルの右側に空白が生まれることがあります。NULLは他にも様々な使い方ができるので、また別の記事で紹介しますね!
練習問題
練習問題
以下のテーブルを使って、登録ユーザーidごとの商品購入数を抽出するクエリを書いてください。ただし、users.id と purchases.user_idは紐づくこととします。
| 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 |
| id | item | purchased_at | user_id |
|---|---|---|---|
| 1 | 干し柿 | 2022-1-3 | 2 |
| 2 | 干し柿 | 2022-1-4 | 1 |
| 3 | 干し柿まんじゅう | 2022-1-4 | 4 |
SQL入門編では、テーブルの結合の話はこれで終わりです!
テーブルの結合については、SQL入門者にとっての一つの山場だと言われています。
難しい内容だったかもしれませんが、ここまで読んでくださり、本当にありがとうございます!
テーブルの結合は本当に奥が深く、様々なテクニックがあるので、また別の機会に記事にしたいと思います。
それでは、また次の記事でお会いしましょう(^^)/