はじめに:JOINを制する者はSQLを制す!
こんにちは!データ分析を始めると、ほぼ確実にぶつかる壁が
JOIN(テーブルの結合) です。「顧客テーブルと注文テーブルをくっつけて、誰が何を買ったか見たい」——こんなとき活躍するのがJOINです。
SnowflakeのSQLは標準SQLにとても近いので、ここで覚えた知識は他のデータベースでも使えます。今回は
INNER / LEFT / RIGHT / FULL OUTER の4種類を、図とサンプルでスッキリ整理しましょう!SELECT文の基本がまだ不安な方は、先に
SnowflakeのSELECT文入門を読んでおくとスムーズですよ。
JOINってそもそも何?
JOINは、
共通のキー(列)を使って2つ以上のテーブルを横につなげる操作です。例えば「customers(顧客)」と「orders(注文)」を
customer_id でつなぐイメージですね。
違いは「どちらのテーブルの行を残すか」。これだけ押さえれば4種類の使い分けはすぐ覚えられます。
サンプルテーブルを用意しよう
具体例で見ていきます。次の2つのテーブルを想像してください。
-- customers テーブル
| customer_id | name |
|-------------|--------|
| 1 | 佐藤 |
| 2 | 鈴木 |
| 3 | 田中 |
-- orders テーブル
| order_id | customer_id | item |
|----------|-------------|----------|
| 101 | 1 | コーヒー |
| 102 | 2 | 紅茶 |
| 103 | 4 | ココア |
「田中さん(id=3)」は注文がなく、「customer_id=4」は顧客マスタにいません。この食い違いがJOIN種別の差を生むポイントです。
INNER JOIN:両方にあるものだけ
両方のテーブルでキーが一致した行だけを返します。一番よく使う基本のJOINです。
SELECT c.name, o.item
FROM customers c
INNER JOIN orders o
ON c.customer_id = o.customer_id;
結果は「佐藤-コーヒー」「鈴木-紅茶」の2行のみ。田中さん(注文なし)もid=4(顧客なし)も消えます。
「実際に注文してくれた顧客だけ知りたい」ようなときに最適です。
LEFT OUTER JOIN:左を全部残す
左側のテーブルの行は全部残し、右側で一致するものをくっつけます。一致しない部分はNULLになります。
SELECT c.name, o.item
FROM customers c
LEFT OUTER JOIN orders o
ON c.customer_id = o.customer_id;
結果は3行で、田中さんの行は
item が NULL に。
「全顧客の一覧を出して、注文があれば一緒に見たい」ようなレポート集計でよく使います。実務で一番出番が多いのがこのLEFT JOINです。
RIGHT OUTER JOIN:右を全部残す
LEFTの逆で、
右側のテーブルの行を全部残すJOINです。
SELECT c.name, o.item
FROM customers c
RIGHT OUTER JOIN orders o
ON c.customer_id = o.customer_id;
id=4の注文(ココア)は顧客名がNULLで残ります。実務ではテーブルの順番を入れ替えてLEFT JOINで書くことが多く、RIGHT JOINの登場機会は少なめ。ただ既存SQLを読むときに混乱しないよう、意味は知っておきましょう。
FULL OUTER JOIN:両方とも全部残す
左右どちらの行も全部残す欲張りJOINです。一致しない部分は両側ともNULLになります。
SELECT c.name, o.item
FROM customers c
FULL OUTER JOIN orders o
ON c.customer_id = o.customer_id;
「マスタ未登録の注文」と「注文ゼロの顧客」の両方を一度に検出できるので、
データ品質チェックや差分確認に重宝します。
使い分けのまとめ
- INNER:両方にある行だけが欲しい(一番厳しい条件)
- LEFT:左を主役にして、関連情報をくっつけたい
- RIGHT:右を主役にしたい(LEFTで書き換え可能)
- FULL OUTER:抜け漏れも含めて全部見たい
Snowsightのワークシートに上のSQLを貼り付けて、結果の違いを目で確認するのがおすすめです。Snowsightの基本操作は
Snowsightの画面構成と基本操作を参考にしてくださいね。テーブルを作る場所(DB/スキーマ)を迷ったら
Snowflakeのデータベース・スキーマ・テーブル階層もどうぞ。
まとめ
JOINは「
どちらの行を残したいか」を意識すれば迷いません。まずはINNERとLEFTの2つを使いこなせるようになれば、業務で出てくるクエリの8割はカバーできます。あとは実際のデータで手を動かしながら、RIGHTとFULL OUTERも引き出しに入れていきましょう!
参考リンク
関連記事