Skip to content

BigQueryでテーブルを結合する:JOIN構文の完全ガイド

BigQueryでデータ分析を行う際、複数のテーブルを結合して情報を統合することは日常的な作業です。今回は、JOIN構文の基本から実践的な使い分けまで、わかりやすく解説します。

まず、BigQueryでテーブルを参照する基本的な構文を確認しておきましょう。

SELECT カラム名
FROM プロジェクトID.データセット名.テーブル名

通常、テーブル名全体をバッククォート(`)で囲む必要はありません。カラム名やテーブル名に予約語や特殊文字が含まれる場合のみ、個別の要素をバッククォートで囲みます。

実践:2つのテーブルを結合する

Section titled “実践:2つのテーブルを結合する”

以下のような2つのテーブルがあるとします。

-- テーブル1: publishers(出版社情報)
SELECT id, name, country
FROM my-project.analytics.publishers
-- テーブル2: contracts(契約情報)
SELECT id, fee_rate, publisher_id
FROM my-project.analytics.contracts

これらを publisher_id で結合して、「どの出版社がどの手数料率で契約しているか」を一覧化したいとします。

INNER JOIN:両方に存在するデータのみ取得

Section titled “INNER JOIN:両方に存在するデータのみ取得”

最も基本的な結合方法です。両方のテーブルに存在するレコードのみを取得します。

SELECT
p.id AS publisher_id,
p.name AS publisher_name,
p.country,
c.id AS contract_id,
c.fee_rate
FROM
my-project.analytics.publishers AS p
INNER JOIN
my-project.analytics.contracts AS c
ON
p.id = c.publisher_id
LIMIT 1000
要素説明
AS p, AS cテーブルにエイリアス(別名)を付けることで、クエリを読みやすくする
INNER JOIN両方のテーブルに存在するレコードのみを取得
ON p.id = c.publisher_id結合条件。publishers の id と contracts の publisher_id が一致するレコードを紐付ける
publisher_idpublisher_namecountrycontract_idfee_rate
1Publisher AJapan1010.15
2Publisher BUSA1020.20

この例では、契約情報(contracts)が存在する出版社のみが結果に含まれます。

データの要件に応じて、異なる結合方法を選択できます。

LEFT JOIN:左側のテーブルを全て保持

Section titled “LEFT JOIN:左側のテーブルを全て保持”
SELECT
p.id AS publisher_id,
p.name AS publisher_name,
p.country,
c.id AS contract_id,
c.fee_rate
FROM
my-project.analytics.publishers AS p
LEFT JOIN
my-project.analytics.contracts AS c
ON
p.id = c.publisher_id
LIMIT 1000

用途: 「全ての出版社と、契約がある場合はその情報も表示したい」場合に使用。契約がない出版社も結果に含まれ、contract_id と fee_rate は NULL になります。

publisher_idpublisher_namecountrycontract_idfee_rate
1Publisher AJapan1010.15
2Publisher BUSA1020.20
3Publisher CUKNULLNULL

RIGHT JOIN:右側のテーブルを全て保持

Section titled “RIGHT JOIN:右側のテーブルを全て保持”
SELECT
p.id AS publisher_id,
p.name AS publisher_name,
p.country,
c.id AS contract_id,
c.fee_rate
FROM
my-project.analytics.publishers AS p
RIGHT JOIN
my-project.analytics.contracts AS c
ON
p.id = c.publisher_id
LIMIT 1000

用途: 「全ての契約と、対応する出版社情報を表示したい」場合に使用。出版社情報が見つからない契約も結果に含まれます(データ不整合の検出に便利)。

FULL OUTER JOIN:両方のテーブルを全て保持

Section titled “FULL OUTER JOIN:両方のテーブルを全て保持”
SELECT
p.id AS publisher_id,
p.name AS publisher_name,
p.country,
c.id AS contract_id,
c.fee_rate
FROM
my-project.analytics.publishers AS p
FULL OUTER JOIN
my-project.analytics.contracts AS c
ON
p.id = c.publisher_id
LIMIT 1000

用途: 「出版社と契約の全データを取得し、対応関係がないものも確認したい」場合に使用。マスタデータとトランザクションデータの整合性チェックに有効です。

テーブル名が長い場合、エイリアスを使わないとクエリが読みにくくなります。

-- ❌ 読みにくい
SELECT
my-project.analytics.publishers.id,
my-project.analytics.contracts.fee_rate
FROM my-project.analytics.publishers
INNER JOIN my-project.analytics.contracts
ON my-project.analytics.publishers.id = my-project.analytics.contracts.publisher_id
-- ✅ 読みやすい
SELECT p.id, c.fee_rate
FROM my-project.analytics.publishers AS p
INNER JOIN my-project.analytics.contracts AS c
ON p.id = c.publisher_id

2. 結合キーにインデックスがあるか確認

Section titled “2. 結合キーにインデックスがあるか確認”

BigQueryでは、結合キーに使用するカラムが適切にパーティション分割されているか、クラスタ化されているかで、クエリのパフォーマンスが大きく変わります。

LEFT JOINやFULL OUTER JOINを使う場合、NULL値が発生します。集計関数(COUNT、SUMなど)を使う際は、NULL値の扱いに注意しましょう。

-- NULL を 0 として扱う例
SELECT
p.name,
IFNULL(c.fee_rate, 0) AS fee_rate
FROM my-project.analytics.publishers AS p
LEFT JOIN my-project.analytics.contracts AS c
ON p.id = c.publisher_id

BigQueryでのテーブル結合において、以下の点を押さえておきましょう。

  1. JOIN の種類を理解する: INNER、LEFT、RIGHT、FULL OUTER の違いと使い分け
  2. エイリアスを活用する: クエリの可読性を高める
  3. 結合条件を明確にする: ON句で正確な結合キーを指定
  4. NULL値の扱いに注意: 特にOUTER JOINを使う場合
結合タイプ取得されるレコードよくある用途
INNER JOIN両方のテーブルに存在するレコードのみ確実に紐付くデータのみ取得
LEFT JOIN左側の全レコード + 右側の一致するレコードマスタデータを全て表示
RIGHT JOIN右側の全レコード + 左側の一致するレコードトランザクションデータを全て表示
FULL OUTER JOIN両方のテーブルの全レコードデータの整合性チェック

適切なJOINを選択することで、効率的で正確なデータ分析が可能になります。実務でのデータ要件に応じて、最適な結合方法を選びましょう。