BigQueryでテーブルを結合する:JOIN構文の完全ガイド
BigQueryでデータ分析を行う際、複数のテーブルを結合して情報を統合することは日常的な作業です。今回は、JOIN構文の基本から実践的な使い分けまで、わかりやすく解説します。
BigQueryのテーブル参照の基本
Section titled “BigQueryのテーブル参照の基本”まず、BigQueryでテーブルを参照する基本的な構文を確認しておきましょう。
SELECT カラム名FROM プロジェクトID.データセット名.テーブル名通常、テーブル名全体をバッククォート(`)で囲む必要はありません。カラム名やテーブル名に予約語や特殊文字が含まれる場合のみ、個別の要素をバッククォートで囲みます。
実践:2つのテーブルを結合する
Section titled “実践:2つのテーブルを結合する”以下のような2つのテーブルがあるとします。
-- テーブル1: publishers(出版社情報)SELECT id, name, countryFROM my-project.analytics.publishers
-- テーブル2: contracts(契約情報)SELECT id, fee_rate, publisher_idFROM 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_rateFROM my-project.analytics.publishers AS pINNER JOIN my-project.analytics.contracts AS cON p.id = c.publisher_idLIMIT 1000| 要素 | 説明 |
|---|---|
AS p, AS c | テーブルにエイリアス(別名)を付けることで、クエリを読みやすくする |
INNER JOIN | 両方のテーブルに存在するレコードのみを取得 |
ON p.id = c.publisher_id | 結合条件。publishers の id と contracts の publisher_id が一致するレコードを紐付ける |
結果イメージ
Section titled “結果イメージ”| publisher_id | publisher_name | country | contract_id | fee_rate |
|---|---|---|---|---|
| 1 | Publisher A | Japan | 101 | 0.15 |
| 2 | Publisher B | USA | 102 | 0.20 |
この例では、契約情報(contracts)が存在する出版社のみが結果に含まれます。
結合方法の使い分け
Section titled “結合方法の使い分け”データの要件に応じて、異なる結合方法を選択できます。
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_rateFROM my-project.analytics.publishers AS pLEFT JOIN my-project.analytics.contracts AS cON p.id = c.publisher_idLIMIT 1000用途: 「全ての出版社と、契約がある場合はその情報も表示したい」場合に使用。契約がない出版社も結果に含まれ、contract_id と fee_rate は NULL になります。
結果イメージ
Section titled “結果イメージ”| publisher_id | publisher_name | country | contract_id | fee_rate |
|---|---|---|---|---|
| 1 | Publisher A | Japan | 101 | 0.15 |
| 2 | Publisher B | USA | 102 | 0.20 |
| 3 | Publisher C | UK | NULL | NULL |
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_rateFROM my-project.analytics.publishers AS pRIGHT JOIN my-project.analytics.contracts AS cON p.id = c.publisher_idLIMIT 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_rateFROM my-project.analytics.publishers AS pFULL OUTER JOIN my-project.analytics.contracts AS cON p.id = c.publisher_idLIMIT 1000用途: 「出版社と契約の全データを取得し、対応関係がないものも確認したい」場合に使用。マスタデータとトランザクションデータの整合性チェックに有効です。
実務でのTips
Section titled “実務でのTips”1. エイリアスは必ず使う
Section titled “1. エイリアスは必ず使う”テーブル名が長い場合、エイリアスを使わないとクエリが読みにくくなります。
-- ❌ 読みにくいSELECT my-project.analytics.publishers.id, my-project.analytics.contracts.fee_rateFROM my-project.analytics.publishersINNER JOIN my-project.analytics.contractsON my-project.analytics.publishers.id = my-project.analytics.contracts.publisher_id
-- ✅ 読みやすいSELECT p.id, c.fee_rateFROM my-project.analytics.publishers AS pINNER JOIN my-project.analytics.contracts AS cON p.id = c.publisher_id2. 結合キーにインデックスがあるか確認
Section titled “2. 結合キーにインデックスがあるか確認”BigQueryでは、結合キーに使用するカラムが適切にパーティション分割されているか、クラスタ化されているかで、クエリのパフォーマンスが大きく変わります。
3. NULL値の扱いに注意
Section titled “3. NULL値の扱いに注意”LEFT JOINやFULL OUTER JOINを使う場合、NULL値が発生します。集計関数(COUNT、SUMなど)を使う際は、NULL値の扱いに注意しましょう。
-- NULL を 0 として扱う例SELECT p.name, IFNULL(c.fee_rate, 0) AS fee_rateFROM my-project.analytics.publishers AS pLEFT JOIN my-project.analytics.contracts AS cON p.id = c.publisher_idBigQueryでのテーブル結合において、以下の点を押さえておきましょう。
- JOIN の種類を理解する: INNER、LEFT、RIGHT、FULL OUTER の違いと使い分け
- エイリアスを活用する: クエリの可読性を高める
- 結合条件を明確にする: ON句で正確な結合キーを指定
- NULL値の扱いに注意: 特にOUTER JOINを使う場合
| 結合タイプ | 取得されるレコード | よくある用途 |
|---|---|---|
| INNER JOIN | 両方のテーブルに存在するレコードのみ | 確実に紐付くデータのみ取得 |
| LEFT JOIN | 左側の全レコード + 右側の一致するレコード | マスタデータを全て表示 |
| RIGHT JOIN | 右側の全レコード + 左側の一致するレコード | トランザクションデータを全て表示 |
| FULL OUTER JOIN | 両方のテーブルの全レコード | データの整合性チェック |
適切なJOINを選択することで、効率的で正確なデータ分析が可能になります。実務でのデータ要件に応じて、最適な結合方法を選びましょう。