SnowflakeのJOIN完全ガイド|INNER/LEFT/RIGHT/FULL OUTERの使い分け

SnowflakeのJOIN完全ガイド|INNER/LEFT/RIGHT/FULL OUTERの使い分け Snowflake

はじめに:JOINを制する者はSQLを制す!

こんにちは!データ分析を始めると、ほぼ確実にぶつかる壁が JOIN(テーブルの結合) です。「顧客テーブルと注文テーブルをくっつけて、誰が何を買ったか見たい」——こんなとき活躍するのがJOINです。 SnowflakeのSQLは標準SQLにとても近いので、ここで覚えた知識は他のデータベースでも使えます。今回は INNER / LEFT / RIGHT / FULL OUTER の4種類を、図とサンプルでスッキリ整理しましょう!SELECT文の基本がまだ不安な方は、先にSnowflakeのSELECT文入門を読んでおくとスムーズですよ。

JOINってそもそも何?

JOINは、共通のキー(列)を使って2つ以上のテーブルを横につなげる操作です。例えば「customers(顧客)」と「orders(注文)」を customer_id でつなぐイメージですね。 違いは「どちらのテーブルの行を残すか」。これだけ押さえれば4種類の使い分けはすぐ覚えられます。
SnowflakeのJOIN種類を理解するためcustomersとordersをcustomer_idで結合する仕組みを示す概念図

サンプルテーブルを用意しよう

具体例で見ていきます。次の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です。
SnowflakeのLEFT OUTER JOINで左側customersテーブルの全行を残し一致しない注文がNULLになる結果を示す図

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も引き出しに入れていきましょう!

参考リンク

関連記事