【BigQuery×SQL】2つの表を合体させる方法【JOIN句】

「ExcelのVLOOKUPを使っていて、データが増えすぎてPCが固まってしまった」
「売上データはあるけれど、商品名や単価が別の表にしかないから、一つずつコピペするのが面倒くさい」

実務でこんな悩みを抱えていませんか?

「JOIN(ジョイン)」という機能を使えば、バラバラの表を数秒で一つに合体させることができます。

この記事を学べば、VLOOKUP地獄から解放され、膨大なデータの紐付け作業が瞬時に終わるようになります。

学習をスムーズに進めるために

本サイトでは、実務での再現性を高めるため、全ての記事で共通のサンプルデータを使用しています。

自分のBigQuery環境で実際に手を動かしながら学ぶと、習得スピードが格段に上がります。

まずはサンプルデータ取込手順を参考に、準備を済ませておきましょう!

1. JOIN句とは

JOINとは、「共通の列(IDなど)」をヒントにして、2つの表を横にくっつける機能です。

データの世界では、このくっつける事を「結合」と表現します。

実務では、以下のように利用します。

・売上リスト(sales)に、商品名や価格(products)を表示させたいとき ・注文リストに、顧客の住んでいる都道府県(customers)をくっつけたいとき

売上リストから、「売れた商品」と「個数」は確認出来るけど、「価格」は別のテーブルで管理されていて確認ができない。

確認するために、2つのテーブルを行ったり来たり…。非常に面倒ですよね。

なら、テーブル同士を合体させてしまい、1度に確認できるようにしてしまいましょう!

そんな時、便利なのがJOINです!

2.JOINの基本

「JOINにはいくつか種類がありますが、実務で使うのは9割これ!」

と言っても過言ではないのがLEFT JOIN(左結合)です。

2-1.結合の命綱「結合キー」とは?

実際にコードを書く前に、最も重要な言葉を覚えましょう。

それが「結合キー」です。

結合キーとは、2つのテーブルを結合するための「共通の目印」のことです。

例えば、売上リストに商品名を載せたいなら、両方の表にある「商品ID」が目印になります。

POINT
   

SQLはこの「目印」をヒントにして、相手のテーブルから自分と同じIDを探し出し、横にデータをくっつけます。この「目印を何にするか」を指定するのが、コード内の「ON」という場所です。

  

例えば、テーブルAにはフルーツの「名前」と「色」という列があり、テーブルBには「名前」と「味」という列があるとします。

このままでは情報はバラバラですが、両方のテーブルに共通する「名前」という列を目印にすれば、1つにまとめることができます。

SQLを実行すると、「りんご」というデータが相手のテーブルから自分と同じ「りんご」という名前を探し出し、横にデータをくっつけます。

その結果、1つの行の中に「赤い」と「甘い」という情報が揃った、新しい表ができあがるのです。

これが、結合になります。

2-2.基本的な書き方

SELECT
a.列名,
b.列名
FROM
`プロジェクト.データセット.テーブルA` AS a --1
LEFT JOIN --2
`プロジェクト.データセット.テーブルB` AS b --3
ON --4
a.結合キー = b.結合キー; --5
1:左側のテーブル(ASで「a」というあだ名をつけている)を指定 2:左側のテーブルを分母にして、結合 3:「1」に結合したい右側のテーブル(ASで「b」というあだ名をつけている)を指定 4:これから、結合条件を書くよ。の宣言 5:「テーブルA」と「テーブルB」に存在する共通カラム名(結合キー)で結合条件を指定
注意

テーブル結合をした場合、SELECTで列名を指定する際に、その列名が所属するテーブル名を明示してあげる必要があります。

上記の図解を例として、結合後のテーブルには、「名前」という列名がテーブルAとBの両方に所属しているため、テーブル名を明示してあげないと、どのテーブルから取ってきて良いのか分からずエラーとなります。

仮に、テーブルAから「名前」を取ってきたい場合「a.名前」と書いてあげれば良いですね。

「a」はFROMで指定したテーブルAの「あだ名」です。

FROM以外でテーブル名を指定する場合、この「あだ名」を活用することで、スッキリ書くことができます。

これは、共通の列を結合キーとして指定する際も必要になりますので、必ず覚えておきましょう

3.左右の考え方

左右の概念に戸惑ってはいないでしょうか?

安心してください。その点しっかり説明いたします。

3-1.LEFT JOINは左が主役

まず、SQLの特性として、複数のテーブルを指定する場合、テーブルを横並びにして考えます。

その際、左(LEFT)テーブルを分母として結合しなさい。という指示がLEFT JOINです。

その点を踏まえて、下記のような状態になっています。

①:FROMで最初に指定した「テーブルA」を配置する

②:「LEFT JOIN」の直下で指定した「テーブルB」を、①の右隣へ配置します。

③:この時、テーブルは横並びになっているため、「左右」の概念が生まれます。

④:LEFT JOINで左右のテーブルを結合します。この時、LEFT JOINの「LEFT」は横並びにしたテーブルの「左」のテーブルを指すと同時に、そのテーブルを分母として扱う事を意味します。

つまり、LEFT JOINとは、左テーブル(テーブルA)を分母として、右テーブル(テーブルB)を結合しなさい。という指示になります。

では、左テーブルを分母にした結果、データはどのように処理されていくのか?

3-2.LEFT JOINで結果はどうなる?

「左テーブルを分母にする」と決めたとき、合体した後のデータは以下の3つのパターンのどれかになります。

ここが理解できると、実行結果を見たときに「あ、これは分母に登録がないんだな」と瞬時に判断できるようになります。

①両テーブルにデータが有るケース:無事に合体!右側の情報が横に並びます。 ②左テーブルにしかデータが無いケース:左のデータは残ります。ただし、右側の情報は空っぽ(NULL)になります。 ③右テーブルにしかデータが無いケース:結果には表示されません。(分母に存在しないため)

例えば、左を「売上テーブル」、右を「商品テーブル」を「商品ID」をキーとして結合したとします。

実務でよくあるのが、「売上はあるのに、商品名が空欄(NULL)になっている」というケースです。

これは上記の②にあたります。

つまり、「売れたけれど、商品テーブル(右)に商品IDがまだ登録されていない商品」があることが分かります。

LEFT JOINなら「売上の行を消さずに、情報がないこと(NULL)」を教えてくれるのです。

注意

LEFT JOINの他に、INNER JOINという結合方法があります。
INNER JOINは、LEFT JOINと違って、両方のテーブルに結合キーが存在するデータのみを残します。

つまり、売上テーブル(左)の売上データの商品IDが、商品テーブル(右)に存在しない場合、売上データそのものが出力から消えてしまい非常に危険です。

これが、実務でLEFT JOINが最も愛用される理由です。
SQLに慣れるうちは、LEFT JOINを使うことをお勧めします。

チェック

LEFT JOIN(左結合)があれば、当然RIGHT JOIN(右結合)もあります。

ですが、個人的にお勧めしません。
なぜなら、人は物事を考えるとき、左から右に考えるため、単純に使いずらいためです。

4.サンプルデータによる実践

実務をイメージするために、サンプルデータの「sales(売上テーブル)」と「products(商品テーブル)」を使って実際に集計してみましょう。

【使用するテーブル①:売上テーブル(sales)】

【使用するテーブル②:商品テーブル(products)】

4-1.売上明細リストを作ってみましょう

「いつ、どの商品がいくら売れたか」の売上明細リストを作ってみましょう。

今回は売上個数ではなく、「いくら売れたか?」の売上金額を確認したいので、金額(price)を見てあげる必要があります。

そのため、金額(price)情報が存在しない売上テーブル(sales)だけでは確認ができません。

そこで、金額(price)情報を持つ商品テーブル(products)を、売上テーブル(sales)に結合し、1つのテーブルにまとめてしまいます。

ここで重要になるのが、2つのテーブルを繋ぐ「結合キー」です。

SELECT
  s.sale_date AS `購入日`,
  s.product_id AS `商品ID`,
  p.price AS `購入金額`
FROM
  `test.sales` AS s --1
LEFT JOIN --2
  `test.products` AS p --3
ON --4
  s.product_id = p.product_id; --5

4-2.実行結果

このように、売上テーブル(sales)に無かった購入金額(price)が結合されました。

4-3.視覚化(図解フロー)

JOINが裏側でどのようにデータを処理しているのか、イメージを確認しましょう。

①:FROMで指定した売上データ(sales)を取得(一部抜粋)

②:売上テーブル(sales)の結合キー(s.product_id)をもとに、商品テーブル(products)から同じ結合キー(p.product_id)を探し、キーが同じであれば、レコード同士を結合する。

③:結合したテーブルから、SELECTで指定したカラムを取得

④:実行結果

5.実務で役立つ「+α」の使い方

JOINで情報を集めるだけでなく、その場で一気に計算まで終わらせるのが実務では求められます。

5-1.算術演算との組み合わせ

JOINで単価(price)を引っ張ってきたら、わざわざExcelに貼り付けてから計算する必要はありません。

以下のように書けば、結合と同時に「個数 × 単価」の計算も終わらせることができます。

SELECT
 s.sale_date AS `購入日`,
 p.product_name AS `商品名`,
 s.quantity AS `数量`,
 p.price AS `単価`,
 s.quantity * p.price AS `売上金額` -- ここで「数量 × 単価」を計算しています
FROM
`test.sales` AS s
LEFT JOIN
`test.products` AS p
ON
s.product_id = p.product_id;
チェック

Excelの関数ミスがなくなる: 1行ずつ数式をオートフィルする手間も、参照ミスも起こりません。

データが重くならない: 数万行の計算もBigQuery側で一瞬で終わるため、PCが固まる心配がありません。

そのまま報告に使える: 実行結果をコピーするだけで、すでに「売上金額」まで入った綺麗な表が手に入ります。

6.まとめ・復習

2つの表をくっつける「JOIN」はいかがでしたか?

ExcelのVLOOKUPと同じ感覚ですが、数万行、数百万行あっても一瞬で終わるのがSQLの凄いところです。

チェック

LEFT JOINが基本!左の表をベースに情報を足す。

ONの後に「共通の列(ID)」を指定して、目印を教える。

あだ名(AS)を付けて、どの表の列かハッキリさせる。

実は、JOINはSQL初心者がぶつかる「最初の壁」と言われています。
ここを乗り越えられたあなたは、もう立派なSQL使いの仲間入りです!

これまでExcelのVLOOKUPで1つずつ紐付けていた作業が、たった数行のコードで一瞬で終わります。

このスキルがあるだけで、扱えるデータの量も、作業スピードも劇的に変わるはずです。

「文法はわかった。でも、実務でミスをするのがまだ怖い……」という方へ
➡ 【独学の限界?】SQL学習で「あと一歩」が進まない時の処方箋

目次

用語辞典