前回の記事では、データ分析の際に欠かせない「テーブルの結合」について勉強しました。
実は、テーブルの結合方法には何種類があり、使い分けることで分析がぐっと楽になります!
ということで、今日はテーブルの結合方法を押さえましょう!
目次
結合方法の種類
データ分析時は、以下の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入門者にとっての一つの山場だと言われています。
難しい内容だったかもしれませんが、ここまで読んでくださり、本当にありがとうございます!
テーブルの結合は本当に奥が深く、様々なテクニックがあるので、また別の機会に記事にしたいと思います。
それでは、また次の記事でお会いしましょう(^^)/