Looker Studioで統合データを扱う際に避けては通れないのが「結合演算子何を選べばいいか問題」。
結合演算子には「左外部結合」「右外部結合」「内部結合」「完全外部結合」「クロス結合」の5つも種類があるため、それぞれどう違い、何を選ぶとどのような結果になるのかいまいち把握していない方も多いのではないだろうか。
今回は、Looker Studioの結合演算子5つの違いとそれぞれの挙動、どういった基準でどれを選べばいいのかについて解説する。
※ 本記事の内容を理解するために、最低限おさえておくべき用語を以下にまとめる。
テーブル:「表」形式のデータのこと
フィールド:テーブルの列のこと。「カラム」と呼ばれることもある
レコード:テーブルの行のこと
結合キー:各テーブルの結合に使うフィールド名のこと
そもそもテーブルの結合とは?
複数のテーブルを1つのテーブルとしてまとめ、より詳細な分析や可視化を行うための機能のことである。
例えば、顧客データや商品データ、売上データなど別々で管理している異なるテーブルを、結合により1つのテーブルにまとめることで、どのような顧客がどのような商品をいくらぐらい買う傾向にあるのかといったより深い洞察を得たり、データビジュアライゼーションにおいて複雑なレポートを作成できたりする。
Looker Studioの5つの結合演算子
結合演算子は5つあり、意味はそれぞれ以下のとおりである。
左外部結合 | 左側のテーブルはすべてのレコードを、右側は左側と値が重なっているレコードのみを残す |
右外部結合 | 右側のテーブルはすべてのレコードを、左側は右側と値が重なっているレコードのみを残す |
内部結合 | それぞれのテーブルが共通して持つフィールドの値が重なっているレコードのみを残す |
完全外部結合 | それぞれのテーブルにある全レコードを残す |
クロス結合 | 左側テーブルのすべてのレコードの1行1行に、右側テーブルの全レコードを結合する。 総当たりで結合していくため、5つの結合演算子の中で唯一結合キーが必要ない |
もう少し具体的に説明しよう。
注文があった数量を管理する「order_quantity」と注文のあった商品名を管理する「order_name」の2つのテーブルがあるとする。
テーブル①:order_quantity
order_id | order_qty |
---|---|
B | 8 |
C | 5 |
D | 3 |
テーブル②:order_name
order_id | order_name |
---|---|
A | ピーマン |
B | 納豆 |
C | ヨーグルト |
実務においてはこんなシンプルなテーブルはありえないと思うが、今回は結合演算子の違いを理解していただくために、あえて簡素なテーブルを用意している。
これらをそれぞれの結合演算子で結合すると以下のようになる。なお、「order_quantity」テーブルを左側、「order_name」テーブルを右側とし、結合キーはorder_idフィールドとなる。
左外部結合
order_id | order_qty | order_name |
---|---|---|
B | 8 | 納豆 |
C | 5 | ヨーグルト |
D | 3 | null |
内部結合
order_id | order_qty | order_name |
---|---|---|
B | 8 | 納豆 |
C | 5 | ヨーグルト |
クロス結合
order_id (①) | order_qty | order_id (②) | order_name |
---|---|---|---|
B | 8 | A | ピーマン |
B | 8 | B | 納豆 |
B | 8 | C | ヨーグルト |
C | 5 | A | ピーマン |
C | 5 | B | 納豆 |
C | 5 | C | ヨーグルト |
D | 3 | A | ピーマン |
D | 3 | B | 納豆 |
D | 3 | C | ヨーグルト |
右外部結合
order_id | order_qty | order_name |
---|---|---|
A | null | ピーマン |
B | 8 | 納豆 |
C | 5 | ヨーグルト |
完全外部結合
order_id (①) | order_qty | order_id (②) | order_name |
---|---|---|---|
null | null | A | ピーマン |
B | 8 | B | 納豆 |
C | 5 | C | ヨーグルト |
D | 3 | null | null |
左外部結合

左外部結合は、左側のすべてのレコードと左側と値が重なっている右側のレコードのみを返すため、左側の「order_quantity」テーブルのすべてのレコードが返されるが、右側の「order_name」テーブルにしかないorder_id:Aのレコードは返されない。
最終的なテーブルとしては、共通のorder_id:B、Cを持つ“納豆”と“ヨーグルト”はorder_nameフィールドにて返されるが、左側テーブルの「order_quantity」にしかないorder_id:Dのorder_nameフィールドには“null”が返される。
右外部結合

右外部結合は、右側のすべてのレコードと右側と値が重なっている左側のレコードのみを返すため、右側の「order_name」テーブルのすべてのレコードが返されるが、左側の「order_quantity」テーブルにしかないorder_id:Dのレコードは返されない。
最終的なテーブルとしては、共通のorder_id:B、Cを持つ“8”と“5”はorder_quantityフィールドにて返されるが、右側テーブルの「order_name」にしかないorder_id:Aのorder_quantityフィールドには“null”が返される。
右外部結合と左外部結合は相対しているものなので、左側のテーブルを右側にもってきて、右外部結合した場合、同じ結果が得られる。
内部結合

内部結合は、それぞれのテーブルが共通して持つフィールドの値が重なっているレコードのみを残すため、共通のorder_id:B、Cを持つレコードのみがそれぞれのテーブルから返される。
つまり、order_quantityフィールドでは“8”と“5”が、order_quantityフィールドには“納豆”と“ヨーグルト”が返される。
完全外部結合

完全外部結合は、それぞれのテーブルにある全レコードを残すため、最終的なテーブルとしては、一方のテーブルにはあって他方のテーブルにはないフィールドの値は“null”となる。
クロス結合

クロス結合は、左側テーブルのすべてのレコードの1行1行に右側テーブルの全レコードを総当たりで結合していくため、左側テーブルである「order_quantity」の1行目に、右側「order_name」テーブルの3行が結合され、同じように「order_quantity」の2行目に、右側「order_name」テーブルの3行が結合され…といったかたちで結合されていく。
クロス結合は、5種類の中で最もレコード数が多くなる結合演算子であり、最終的なテーブルの行数は、各テーブルのレコード数の掛け算となる。
例えば上記の場合、3レコードずつのテーブルの結合のため、3×3で9行のテーブルとなる。
3つ以上のテーブルの結合での考え方
3つ以上のテーブルの結合の場合でも、結合方法がどのテーブル同士でも同じ演算子を使っていれば、2つのテーブルの結合のときとそこまで変わらない。
例えば、商品IDと店舗ごとの売上個数を管理する「sales」と、店舗の名前を管理する「shop」、店舗があるエリア名を管理する「area」の3つのテーブルがあるとする。
テーブル①:sales
product_id | shop_id | sales |
---|---|---|
A | X | 180 |
A | W | 154 |
A | Y | 113 |
B | T | 121 |
B | Z | 172 |
B | S | 196 |
テーブル②:shop
shop_id | area_id | shop_name |
---|---|---|
V | 5 | 渋谷店 |
W | 3 | 吉祥寺店 |
X | 1 | 中野店 |
Y | 1 | 東中野店 |
Z | 2 | 高円寺店 |
テーブル③:area
area_id | area_name |
---|---|
1 | 中野区 |
2 | 杉並区 |
3 | 武蔵野市 |
4 | 世田谷区 |
それぞれを左外部結合した場合と完全外部結合をした場合を以下に示す。
「sales」左外部結合「shop」左外部結合「area」
product_id | shop_id | sales | area_id | shop_name | area_name |
---|---|---|---|---|---|
A | X | 180 | 1 | 中野店 | 中野区 |
A | W | 154 | 3 | 吉祥寺店 | 武蔵野市 |
A | Y | 113 | 1 | 東中野店 | 中野区 |
B | T | 121 | null | null | null |
B | Z | 172 | 2 | 高円寺店 | 杉並区 |
B | S | 196 | null | null | null |
「sales」完全外部結合「shop」完全外部結合「area」
product_id | shop_id | sales | area_id | shop_name | area_name |
---|---|---|---|---|---|
null | null | null | null | null | 世田谷区 |
null | null | null | 5 | 渋谷店 | null |
A | X | 180 | 1 | 中野店 | 中野区 |
A | W | 154 | 3 | 吉祥寺店 | 武蔵野市 |
A | Y | 113 | 1 | 東中野店 | 中野区 |
B | T | 121 | null | null | null |
B | Z | 172 | 2 | 高円寺店 | 杉並区 |
B | S | 196 | null | null | null |
結合するテーブルが3つあるためフィールド数も多くなるが、2つのテーブルの結合のときと基本的な考え方は何ら変わらないことがわかるだろう。
異なる演算子が混在する場合の留意点
各テーブル同士の結合で異なる演算子が混在する場合には1つだけ留意点があり、「Looker Studioでは、結合するテーブルの順番は選べず、左端から順に結合されていく」ということを押さえておく必要がある。
例えば、以下のテーブルを完成イメージとして各テーブルを結合したいとする。
product_id | shop_id | sales | area_id | shop_name | area_name |
---|---|---|---|---|---|
A | X | 180 | 1 | 中野店 | 中野区 |
A | W | 154 | 3 | 吉祥寺店 | 武蔵野市 |
A | Y | 113 | 1 | 東中野店 | 中野区 |
B | T | 121 | null | null | null |
B | Z | 172 | 2 | 高円寺店 | 杉並区 |
B | S | 196 | null | null | null |
Looker Studioで結合の順番を自由に指定できる場合、
「sales」左外部結合「shop」内部結合「area」
のようなかたちにして、「shop」内部結合「area」を優先結合すれば、上のテーブルが完成する。
しかしLooker Studioではそれができないため、以下の2通りのパターンで結合するしかない。
このように、どのテーブルも結合方法がすべて同じであれば非常にシンプルだが、異なる結合演算子が混在する場合、結合は左端から順に行われていくことを念頭に入れて行うようにしよう。
結局どれを使えばいいの?
ここまでそれぞれの結合演算子の違いについて説明してきたが、「結局この5つの中のどれを使えばいいの?」という問いに対しては、「どのデータを見たいかによって使い分ける」というのが答えになる。
例えば、「Looker Studioの5つの結合演算子」の章で用いたテーブルでの結合の場合、“null”のような曖昧で正確なデータかどうかわからないものは可視化したくないのであれば、内部結合を選ぶべきだと思うし、注文のあった商品名より注文のあった数量を優先して可視化させたい場合は、左外部結合を選ぶべきだろう。
このような具合で、どのデータを見たいか・見せたいかで都度どれを選ぶか変わってくるので一概に言えるものではない。
ただし、私自身がよく使っているのは「左外部結合」と「内部結合」の2つである。
左外部結合と右外部結合はLooker Studio上で結合の設定を行う際に、どちらのテーブルを左側あるいは右側に持ってくるかだけの違いであるし、クロス結合も、SQLで新しいテーブルを作るための計算過程で使うことはあっても、データビジュアライゼーションを目的とするBIツールで使うことはほとんどないと言っていい。
おわりに
本記事では、Looker Studioの結合演算子5つの違いと、どれを選択すればいいのかというよくある疑問に対する答えについて言及した。
結合演算子はSQLが書ける方からすると馴染みやすいかと思うが、そうでない方からすると理解するのに一苦労かと思うので、本記事を参考にぜひとも習得してほしい。