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

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

前回の記事では、データ分析の際に欠かせない「テーブルの結合」について勉強しました。

実は、テーブルの結合方法には何種類があり、使い分けることで分析がぐっと楽になります!
ということで、今日はテーブルの結合方法を押さえましょう!

結合方法の種類

データ分析時は、以下の2種類の結合方法を知っておけば問題ありません!

INNER JOIN

前回の記事で登場しましたね!
以下のようなクエリを書くことで、INNER JOINでテーブルを結合できます!

SELECT
    *
FROM
    テーブルA
    INNER JOIN テーブルB
        ON 結合条件
INNER JOIN 内部結合

INNER JOINの結合時、テーブルBからON以降の結合条件に合致するレコードが検索されて、テーブルAにくっつきます。
テーブルBのレコードがくっつかなかったテーブルAのレコード(図の水色のレコード)は、除外されます。

LEFT OUTER JOIN

LEFT OUTER JOINは、今回初登場の結合方法ですね。
クエリの書き方は、INNER JOIN と同じです!

SELECT
    *
FROM
    テーブルA
    LEFT OUTER JOIN テーブルB
        ON 結合条件
LEFT OUTER JOIN 左部外部結合

INNER JOIN との違いは、最後にテーブルAのレコードは除外されないという点です。
図のように、結合時にテーブルAの水色のレコードには、テーブルBのレコードはくっつきませんが、結合後もテーブルAの水色のレコードが残っています。

ポイント

テーブルAの中で、テーブルBのレコードが結合されなかったレコードは...

INNER JOINで結合した場合 → 除外される
LEFT OUTER JOINで結合した場合 → 残る

すこし抽象的な話でまだイメージがしづらいと思うので、次は具体的なそれぞれの使い方を見ていきましょう!

結合方法を使い分けてみよう!

今回は、以下二つのテーブルを元に使い分けを説明します。
なお、purchases.user_idusers.idはそれぞれ紐づきます。

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

商品購入者の「id」,「名前」,「購入した商品名」を調べたい時

そんな時は、以下のようにINNER JOINを使います!
これによって、商品を購入していない人のレコードが除外され、商品購入者だけのレコードが抽出されます!

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

■抽出までの流れ

idnamegenderagecreated_atiditempurchased_atuser_id
1太郎男性402022-1-12干し柿2022-1-41
2よしお男性312022-1-11干し柿2022-1-32
4れいか女性302022-1-33干し柿まんじゅう2022-1-44
INNER JOIN の結合で作成されたテーブル

users.id, users.name, purchases.itemの3つを抽出

idnameitem
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

■抽出までの流れ

idnamegenderagecreated_atiditempurchased_atuser_id
1太郎男性402022-1-12干し柿2022-1-41
2よしお男性312022-1-11干し柿2022-1-32
3SAKI女性342022-1-2
4れいか女性302022-1-33干し柿まんじゅう2022-1-44
5ジム男性292022-1-3
LEFT OUTER JOIN の結合で作成されたテーブル

↓ WHERE句で、purchases.id IS NULL(← purchases.idの値が空白 という意味)のレコードのみに絞る

idnamegenderagecreated_atiditempurchased_atuser_id
3SAKI女性342022-1-2
5ジム男性292022-1-3
WHERE句で、purchases.id が NULL(空)のレコードのみに絞られた

users.id, users.nameの2つを抽出

idname
3SAKI
5ジム
最終的な抽出結果

「NULL」って何?

NULLとは「空」という意味で、レコードの値の部分に値がない状態のことを指します。

上記のように、LEFT OUTER JOINを行うことで、新しくできたテーブルの右側に空白が生まれることがあります。
NULLは他にも様々な使い方ができるので、また別の記事で紹介しますね!

練習問題

練習問題

以下のテーブルを使って、登録ユーザーidごとの商品購入数を抽出するクエリを書いてください。ただし、users.idpurchases.user_idは紐づくこととします。

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

SQL入門編では、テーブルの結合の話はこれで終わりです!
テーブルの結合については、SQL入門者にとっての一つの山場だと言われています。
難しい内容だったかもしれませんが、ここまで読んでくださり、本当にありがとうございます!

テーブルの結合は本当に奥が深く、様々なテクニックがあるので、また別の機会に記事にしたいと思います。

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

-SQL
-, , ,