SQL Everyone学習する
SQL EveryoneSQL Everyone
  • トップ
  • マイページ
  • データベース確認
  • 学習ページ
    • SQL概要
    • SQL実行環境構築
    • SQL文法基礎
    • SQL実践問題(初級)
    • SQL実践問題(中級)
    • SQL実践問題(上級)
SQL EveryoneSQL Everyone
  • トップ
  • マイページ
  • データベース確認
  • 学習ページ
    • SQL概要
    • SQL実行環境構築
    • SQL文法基礎
    • SQL実践問題(初級)
    • SQL実践問題(中級)
    • SQL実践問題(上級)
料金プランお問い合わせセミナー記事
プライバシーポリシー利用規約特定商取引法表記

© 2026 SQL Everyone

読み込み中...
SQL文法基礎4/8
No.4

【SQL文法基礎4】複数のテーブルを「横」に結合する 〜 JOIN 〜

データ分析では、1つのテーブルからデータを取得することは少なく、多くの場合複数のテーブルを組み合わせてデータを取得します。 テーブルの結合はSQLを学ぶうえでの最初のハードルになりやすいので、本章でテーブルの結合についてしっかりと学んでいきましょう。

複数のテーブルを組み合わせて分析を行う理由

効率的なデータの管理方法

データ分析では、会社や各部門の売上などを集計することがあります。例えば、ECサイトの分析として、日別の売上を集計したい場合はどのようにデータ分析をする必要があるか考えてみましょう。

本サイトで扱う購入履歴テーブルには、どの商品が購入されたのかの情報はありますが、商品の金額は含まれていません。商品の金額は商品情報テーブルに含まれています。つまり、購入履歴から日別の購入情報を取得して、売上を集計したい場合には、購入履歴テーブルと商品情報テーブルの2つのテーブルを組み合わせる必要があります(※1)。

※1:商品を購入したときの金額を保持したいときは、購入履歴テーブルに商品の金額情報が含まれる場合もあります。テーブルの設計によって、どのテーブルにどんな情報が含まれるかは異なります。本書では、テーブル結合のわかりやすさのために、購入履歴テーブルには商品の金額を含めない設計としています。

・図6-1:複数のテーブルの活用

複数のテーブルの活用
複数のテーブルの活用

なぜ、データ分析に必要なデータが1つのテーブルにまとまっていないのでしょうか。それは、データを管理するうえで、テーブルを別々にしたほうが運用の効率がよいからです。図6.2のように、データが1つにまとまった場合のテーブルを想像してみましょう。一見するとさまざまな情報が1つにまとまっているテーブルのほうが、データ分析において便利のようにも思えます。

・図6-2:1つのテーブルに情報がまとまっている場合

1つのテーブルに情報がまとまっている場合
1つのテーブルに情報がまとまっている場合

しかし、テーブルが1つにまとまっているため、同じ商品を買った場合、「おいしい水」という商品名や「120」という金額の情報が重複してテーブルに保存されます。データベースやテーブルは大量のデータを保存できますが、データの量にも限界があります。このように、同じ情報を保存しておくことはデータの容量の観点で非効率です。

また、もし商品の名前が変更された場合はどうなるでしょうか。仮に「おいしい水」から「美味しい水」に商品名を変更する場合、「おいしい水」のすべての購入履歴のデータを変更する必要があります。テーブルが1つにまとまっていると、「商品情報」を修正するだけのはずが、「購入履歴」も修正することになり、本来関係のないデータを更新することになってしまいます。そのため、テーブルを1つにまとめることは、データを管理するという観点では非効率です。

テーブルの正規化

テーブルを1つにまとめると、データの容量が非効率になったり、データの変更に対応しづらくなってしまうというデメリットがあります。そのため、効率的にデータを管理できるよう、購入履歴テーブルと商品情報テーブルのように、用途ごとにテーブルを分けて設計するのが一般的です。このように、データの重複をなくしてテーブルを設計することを正規化と呼びます。

テーブルを正規化することで、必要最低限のデータをテーブルに保持し、データ容量も効率化することができます。また、「おいしい水」から「美味しい水」に商品名を変更する場合は、商品情報テーブルの「おいしい水」の1行を変更するだけですみます。購入履歴テーブルには影響はなく、更新するデータの量も少なくなります。

・図6-3:テーブルの正規化

テーブルの正規化
テーブルの正規化

しかし、最近のデータ分析環境ではテーブルの正規化をせずに、あえてデータを1つのテーブルに集約する場合もあります。テーブルの正規化は、主にソフトウェア開発の観点で使われる考え方で、テーブルを正規化したほうがデータ運用の観点では効率がよいです。一方で、データ分析では必要なデータを素早く集計するという観点から、データを1つのテーブルに集約したほうが効率がよい場合もあります。データウェアハウスに保存されるテーブルは、データ分析に特化して、1つのテーブルにデータが集約されている場合もあります。

いずれにしても、テーブルの正規化の概念は、データ分析においても非常に重要です。1つのテーブルにデータが集約されているデータウェアハウスだったとしても、すべての分析が1つのテーブルだけで完結するとは限りません。データ分析の用途に合わせて、さまざまなテーブルを組み合わせる必要があります。つまり、複数のテーブルからデータを組み合わせる方法を学ぶことで、よりデータ分析の幅が広がります。

複数のテーブルを「横」に結合するJOIN

JOINとは

前述したとおり、多くのテーブルは正規化されているため、データ分析では複数のテーブルを結合してデータを取得する必要があります。そこで、複数のテーブルを結合する方法として使用するのがJOINです。JOINはテーブルを横に結合することができます。横に結合するとは、テーブルのカラムを追加するということです。そのため、JOINはそれぞれのテーブルから共通するカラムを指定して、複数のテーブルを結合するときに使用します。

・図6-4:テーブルを横に結合する

テーブルを横に結合する
テーブルを横に結合する

例えば、購入履歴テーブル(orders)と、商品情報テーブル(products)の2つのテーブルを結合させたい場合を考えてみましょう。購入履歴テーブルにある商品ID(product_id)と、商品情報テーブルにある商品ID(product_id)が同じ値として保存されています。このとき、商品IDを共通のカラムにして、2つのテーブルを結合することができます。そうすることで、購入履歴テーブルにはなかった商品の金額やカテゴリ別でデータを集計できます。

・図6-5:テーブルの結合例

テーブルの結合例
テーブルの結合例

JOINの種類

図6-6のように、テーブルを結合するJOINには大きく3つ種類があります。内部結合と外部結合とクロス結合です。さらに外部結合には左外部結合(LEFT OUTER JOIN)、右外部結合(RIGHT OUTER JOIN)、完全外部結合(FULL OUTER JOIN)の3種類があります。

・図6-6:JOINの種類

JOINの種類
JOINの種類

また、内部結合、外部結合、クロス結合でそれぞれ結合の方法が異なります。JOINの種類と意味は次のとおりです。

JOINの種類

意味

内部結合(INNER JOIN)

2のテーブルにある共通部分のみを結合して取得する

左外部結合(LEFT OUTER JOIN)

2つのテーブルの左側(FROMの直後)のテーブル情報を残しながらテーブルを結合して結果を取得する

右外部結合(RIGHT OUTER JOIN)

2つのテーブルの右側(JOINの直後)のテーブル情報を残しながらテーブルを結合して結果を取得する

完全外部結合(FULL OUTER JOIN)

2つのテーブル情報をすべて残してテーブルを結合して結果を取得する

クロス結合(CROSS JOIN)

2つのテーブルのデータを総当たりにして結果を取得する

ここで大事な点は、データ分析でよく使われるのは内部結合と左外部結合の2つということです。完全外部結合やクロス結合も場合によっては必要になることはありますが、データ分析では内部結合と左外部結合の使用頻度のほうが圧倒的に多いです。したがって、本サイトではデータ分析で使用頻度の高い内部結合と左外部結合に絞って、JOINの解説をします。左外部結合を理解するうえで、便宜的に右外部結合についても一部解説をしますが、基本的には内部結合と左外部結合の2つが理解できればJOINは十分に活用することができます。

・図6-7:データ分析で重要な結合

データ分析で重要な結合
データ分析で重要な結合

JOINの基本構文

ここからは、実際にSQLでJOINを使うときの基本構文について解説します。SQLでJOINを使用する場合は、FROMで取得するテーブル情報を記述したあと、JOINを使って結合するテーブルを指定します。内部結合の場合はINNER JOIN、左外部結合の場合はLEFT OUTER JOINを使います。JOINで結合するテーブルを指定したあとは、ONを使って結合に必要なカラムを指定します。具体例では、ON o.user_id = u.user_idのようにordersテーブルのuser_idと、usersテーブルのuser_idを共通のカラムとして結合しています。

・JOINの基本構文

</>
1
2
FROM テーブル1 AS テーブル1別名
    INNER JOIN テーブル2 AS テーブル2別名 ON テーブル1別名.カラム名 = テーブル2別名.カラム名

・具体例

</>
1
2
FROM orders AS o
    INNER JOIN users AS u ON o.user_id = u.user_id

また、テーブルを結合するとき、テーブル名にASを使って別名をつけることが多いです。SELECT文のときにも解説しましたが、ASはカラムや集計結果に別名をつけるときに使います。それと同様に、JOINを使うときもASを使うことで、テーブルに別名をつけることができます。

JOINは複数のテーブルを結合するため、SELECTでデータを取得するときに、どのテーブルのどのカラムのデータを取得するかを指定する必要があります。そのときに、テーブル名.カラム名という形でデータを取得します。ASを使ってテーブル名に別名をつけることで、テーブル名.カラム名をすっきり書くことができます。また、このときのASは省略されることもあります。

・ASが省略されるパターン

</>
1
2
FROM orders o
    INNER JOIN users u ON o.user_id = u.user_id

データ分析でよく使う内部結合

内部結合の基本的な使い方

ここからは、具体的な内部結合の使い方について詳しく解説します。

まずは、JOINの基本構文を意識しながらSQL6-1を実行して、出力結果を確認してみましょう。SQL6-1は、購入履歴テーブル(orders)と顧客情報テーブル(users)を内部結合しています。内部結合でテーブルを結合させる場合は、INNER JOINを使用します。このとき、INNER JOINのINNERは省略することができます。単にJOINとだけ記述がある場合は、内部結合を意味するので注意しましょう。結合の際の共通のカラムとしてはどちらのテーブルにも存在する顧客ID(user_id)を使っています。

また、テーブル名はASを使って別名をつけています。SQL6-1では、ordersテーブルはo、usersテーブルはuという別名にしています。テーブル名に別名をつけることによって、SELECTでデータを取得するときに、o.order_idと記述ができます。このとき、oが購入履歴テーブル、order_idが購入IDを指しているため、o.order_idは購入履歴テーブルの購入IDを取得するという意味になります。

★ハンズオン〜SQLを実行してみよう〜

・SQL6-1

</>
1
2
3
4
5
6
7
8
9
SELECT
    o.order_id,
    o.user_id,
    u.gender,
    u.birth_date
FROM
    orders AS o
    INNER JOIN users AS u ON o.user_id = u.user_id
LIMIT 10

・表6-8:SQL6-1の実行結果

order_id

user_id

gender

birth_date

C000001

A000439

女性

1957-12-07

C000002

A000211

女性

1960-04-17

C000002

A000211

女性

1960-04-17

C000003

A000276

女性

1991-01-22

C000004

A000392

女性

1957-09-26

C000005

A000172

女性

1986-05-26

C000005

A000172

女性

1986-05-26

C000006

A000255

男性

1986-09-28

C000006

A000255

男性

1986-09-28

C000007

A000276

女性

1991-01-22

・・・

・・・

・・・

・・・

このように、JOINを使って複数のテーブルからSELECTでデータを取得するときには、どのテーブルのどのカラムのデータを取得するのか指定するのが基本です。例えば、SQL6-1では、ユーザーID(user_id)は購入履歴テーブルと顧客情報テーブルの両方に存在するカラムです。この場合、ユーザーIDを取得するときは、どちらのテーブルのユーザーIDを指定するか明示的に記述しないと、SQLがエラーになってしまいます。

SQLがエラーになることを確認するために、SQL6-2を実行して結果を確認してみましょう。SQL6-2を実行すると、ERROR: column reference "user_id" is ambiguousというエラーが出力されます。これはuser_idというカラムがどちらのテーブルのものか解釈できず、エラーになったということです。

今回のように、複数のテーブルに存在する同一のカラムを取得する場合は、o.user_idまたはu.user_idのようにどちらのテーブルのカラムなのかを明示する必要があります。この場合、どちらのテーブルを指定しても値は同じなので、結果が変わることはありません。

★ハンズオン〜SQLを実行してみよう〜

・SQL6-2

</>
1
2
3
4
5
6
7
8
9
SELECT
    o.order_id,
    user_id,
    u.gender,
    u.birth_date
FROM
    orders AS o
    INNER JOIN users AS u ON o.user_id = u.user_id
LIMIT 10

・表6-9:SQL6-2の実行結果

エラー

ERROR: column reference "user_id" is ambiguous

逆に、複数テーブルがある中で、カラムの情報が被っていない(複数テーブルの中でも1つしかそのカラムが存在しない)場合は、テーブル名の指定は省略することができます。

SQL6-2との違いを確認するために、SQL6-3を実行して出力結果を確認してみましょう。購入ID(order_id)というカラムは購入履歴テーブルだけにしか入っておらず、顧客情報テーブルには存在しません。その場合は、SQL6-3のorder_idのようにテーブル名を指定せず、カラム名だけ指定しても取得するデータが決まっているため、エラーにはなりません。同様に、性別(gender)や生年月日(birth_date)も購入履歴テーブルには存在せず、顧客情報テーブルだけに存在するカラムなので、テーブル名を指定しなくてもエラーにはなりません。

・SQL6-3

</>
1
2
3
4
5
6
7
8
9
SELECT
    order_id,
    o.user_id,
    gender,
    birth_date
FROM
    orders AS o
    INNER JOIN users AS u ON o.user_id = u.user_id
LIMIT 10

・表6-10:SQL6-3の実行結果

order_id

user_id

gender

birth_date

C000001

A000439

女性

1957-12-07

C000002

A000211

女性

1960-04-17

C000002

A000211

女性

1960-04-17

C000003

A000276

女性

1991-01-22

C000004

A000392

女性

1957-09-26

C000005

A000172

女性

1986-05-26

C000005

A000172

女性

1986-05-26

C000006

A000255

男性

1986-09-28

C000006

A000255

男性

1986-09-28

C000007

A000276

女性

1991-01-22

・・・

・・・

・・・

・・・

このように、JOINを使ってデータを取得する場合は、複数のテーブルからデータを取得することになるため、どのテーブルのどのカラムを取得するのか明示する必要があります。カラムだけで値が1つに決まる場合は、テーブル情報を省略できますが、基本的には、テーブル名.カラム名という形でデータを取得するのがおすすめです。このほうがエラーも起きにくいですし、どのテーブルのどのカラムを取得するのか明確になります。そのため、JOINを使う場合は、テーブル名.カラム名でデータを取得しましょう。

内部結合によるデータ件数の減少

内部結合の場合は、2つのテーブルに共通するデータのみ取得します。逆に、2つのテーブルに共通しないデータは結合されないことになります。データが結合されないと、もともとあったテーブルからデータが欠損した状態になります。つまり、内部結合を使ってテーブルを結合するときには、結合する前とあとでデータの件数が減少する可能性があります。そのため、内部結合を使う場合は、どのようにデータが変化しているのか確認することが重要です。

SQL6-4、SQL6-5を実行して、テーブルを内部結合する前とあとでデータがどのように変化しているか、出力結果の違いを確認してみましょう。SQL6-4のように内部結合を行わずに、単純に購入履歴テーブルの行数を取得した場合は、集約関数のCOUNTを使って10万件のデータがあると確認できます。

一方で、SQL6-5のように購入履歴テーブルと顧客情報テーブルを内部結合して行数を取得すると、本サイトのデータでは同じく10万件となっています。これは、本サイトのデータではすべての購入履歴に有効なユーザーIDが設定されているためです。実際の業務データでは、ユーザーIDがNULLの行がある場合など、内部結合によって両方のテーブルに存在しないデータが除外され、もともとの購入履歴テーブルの行数よりも少なくなることがあります。

★ハンズオン〜SQLを実行してみよう〜

・SQL6-4

</>
1
2
3
4
SELECT
    COUNT(*)
FROM
    orders

・表6-11:SQL6-4の実行結果

COUNT(*)

100000

・SQL6-5

</>
1
2
3
4
5
SELECT
    COUNT(*)
FROM
    orders AS o
    INNER JOIN users AS u ON o.user_id = u.user_id

・表6-12:SQL6-5の実行結果

COUNT(*)

100000

本サイトで扱う購入履歴テーブルでは、すべての購入データにユーザーID(user_id)が設定されており、すべてのユーザーIDは顧客情報テーブルに存在します。そのため、今回のデータでは内部結合を行っても購入履歴テーブルの件数と変わりません。

ただし、実際の業務データでは、会員登録せずにゲストとして購入した場合など、ユーザーIDがNULLになる行が存在することがあります。そのようなデータで内部結合を行うと、顧客情報テーブルにユーザーIDがNULLのデータは存在しないため、それらの行は結合されません。その結果、内部結合後の行数がもとの購入履歴テーブルよりも少なくなります。

・図6-13:内部結合の注意点

内部結合の注意点
内部結合の注意点

内部結合によるデータ件数の増加

内部結合を使うと、2つのテーブルに共通するデータのみを取得するため、結合によってデータの件数が減ってしまうことがあると先ほど解説しました。しかし、内部結合を使うと、逆にデータの件数が増える場合もあります。

例えば、あるときから値上げして商品の値段が変わった場合など、同じ商品IDで複数の違う値段の商品が存在することがあります。このとき、内部結合を使って購入履歴テーブルと商品情報テーブルを結合すると、1つの購入履歴の行に対して、同じ商品IDで複数の行が結合されます。その結果、内部結合したことによってデータの件数が増えます。

・図6-14:内部結合でデータの件数が増える場合

内部結合でデータの件数が増える場合
内部結合でデータの件数が増える場合

このように、内部結合を使うと、結合前とあとでデータの件数が増減する可能性があります。内部結合によってデータの件数がどのように変化するかは、実際に分析するデータの中身によって変わります。件数が増える場合も減る場合もどちらの可能性も考慮しながら、内部結合を正しく使いましょう。

データ分析でよく使う左外部結合

左外部結合の基本的な使い方

ここからは、左外部結合の具体的な使い方について詳しく解説します。

まずは、JOINの基本構文を意識しながら、SQL6-6を実行して出力結果を確認してみましょう。左外部結合も、基本的なSQLの構文は内部結合とほとんど同じです。内部結合の場合はINNER JOINを使いましたが、左外部結合の場合はLEFT OUTER JOINを使います。OUTERは省略することができるため、左外部結合の場合はLEFT JOINと書くこともできます。

★ハンズオン〜SQLを実行してみよう〜

・SQL6-6

</>
1
2
3
4
5
6
7
8
9
SELECT
    o.order_id,
    o.user_id,
    u.gender,
    u.birth_date
FROM
    orders AS o
    LEFT OUTER JOIN users AS u ON o.user_id = u.user_id
LIMIT 10

・表6-15:SQL6-6の実行結果

order_id

user_id

gender

birth_date

C000001

A000439

女性

1957-12-07

C000002

A000211

女性

1960-04-17

C000002

A000211

女性

1960-04-17

C000003

A000276

女性

1991-01-22

C000004

A000392

女性

1957-09-26

C000005

A000172

女性

1986-05-26

C000005

A000172

女性

1986-05-26

C000006

A000255

男性

1986-09-28

C000006

A000255

男性

1986-09-28

C000007

A000276

女性

1991-01-22

・・・

・・・

・・・

・・・

外部結合には左外部結合と右外部結合がありますが、どちらを使用するかでデータを取得するもととなるテーブルが異なります。また、「左」と「右」の概念が存在しますが、SQLでは**FROMのあとに書いたテーブルを左側、JOINのあとに書いたテーブルを右側**と解釈します。つまり、SQL6-6の左外部結合の場合は、FROMのあとに購入履歴テーブル(orders)が記述されており、JOINのあとに顧客情報テーブル(users)が記述されているので、購入履歴テーブルの情報をもとにして顧客情報テーブルを結合しています。

また、右外部結合を使うときは、LEFT OUTER JOINをRIGHT OUTER JOINに変えるだけです。その場合、JOINのあとに記述されている顧客情報テーブルをもとにして購入履歴テーブルを結合します。

・右外部結合

</>
1
2
3
FROM
    orders AS o
    RIGHT OUTER JOIN users AS u ON o.user_id = u.user_id

実際のデータ分析では、RIGHT OUTER JOINを使うことはかなり少ないです。RIGHT OUTER JOINとLEFT OUTER JOINは、FROMのあとに指定するテーブルと、JOINのあとに指定するテーブルを入れ替えることで、基本的にはどちらでも同じデータを取得できます。つまり、どちらか一方が使えれば、データ分析で困ることはほとんどありません。したがって、本サイトでは外部結合に関してはデータ分析でよく使用するLEFT OUTER JOINのみを解説します。

左外部結合の注意点

左外部結合は、FROMのあとに指定したテーブル情報をもとに、テーブルを結合して結果を取得します。内部結合の場合は、2つのテーブルに共通するデータのみを取得するため、内部結合と左外部結合では結合の方法が異なります。

どちらを使うかはどういったデータを集計したいかによるので、まずは違いをしっかりと理解することが重要です。内部結合の場合は、テーブルを結合する前とあとでデータの件数が増減する可能性がありました。左外部結合を使う場合も、テーブルを結合する前とあとでデータがどのように変化するのか確認しましょう。

SQL6-7、SQL6-8、SQL6-9を実行して、内部結合と左外部結合の違いについて確認してみましょう。SQL6-7は購入履歴テーブルだけのデータ件数を取得するSQLで、SQL6-8は購入履歴テーブルと顧客情報テーブルを内部結合して、データの件数を取得するSQLです。それぞれの違いは内部結合のときに解説したとおりで、内部結合の場合は両方のテーブルに存在する行のみを取得するため、結合によってデータが少なくなることもあります。

一方で、SQL6-9は購入履歴テーブルをもとにして、顧客情報テーブルを左外部結合しています。結合したときの行数は単純に購入履歴テーブルだけの行数を取得したときと同じです。その理由は、左外部結合は左側のテーブル(FROMで指定したテーブル)をもとにしてテーブルを結合するため、左側のテーブルはすべて残った状態で結合されるからです。

★ハンズオン〜SQLを実行してみよう〜

・SQL6-7

</>
1
2
3
4
SELECT
    COUNT(*)
FROM
    orders

・表6-16:SQL6-7の実行結果

COUNT(*)

100000

・SQL6-8

</>
1
2
3
4
5
SELECT
    COUNT(*)
FROM
    orders AS o
    INNER JOIN users AS u ON o.user_id = u.user_id

・表6-17:SQL6-8の実行結果

COUNT(*)

100000

・SQL6-9

</>
1
2
3
4
5
SELECT
    COUNT(*)
FROM
    orders AS o
    LEFT JOIN users AS u ON o.user_id = u.user_id

・表6-18:SQL6-9の実行結果

COUNT(*)

100000

本サイトのデータでは、購入履歴テーブルのすべての行に有効なユーザーIDが設定されているため、内部結合でも左外部結合でも同じ件数になります。ただし、実際の業務データでユーザーIDがNULLの行が存在する場合、内部結合であればそれらの行は結合されませんが、左外部結合では購入履歴テーブルにあるユーザーIDがNULLの顧客情報はNULLの状態で結合され、データが欠損することなく取得できます。

つまり、左外部結合の場合はFROMで指定したテーブルからデータが減ることはなく、もとのデータを維持したまま他のテーブルと結合することができます。

・図6-19:外部結合の注意点

内部結合では、結合によってデータの件数が増える場合も減る場合もどちらもあると解説しましたが、左外部結合に関しては、データの件数が減ることはありません。左外部結合は、FROMのあとに指定したテーブルのデータをすべて残したまま結合します。しかし、内部結合では結合のときに複数の行が結合される場合があるため、データの件数が増えることがあります。それと同様に、左外部結合でもデータの件数が増える場合はあります。そのため、左外部結合を使うときには、データの件数が増える可能性を考慮しながら正しく活用しましょう。

結合の順番による注意点

外部結合には左外部結合と右外部結合があるため、FROMのあとにどのテーブルを指定するかで最終的に得られるデータが変わる可能性があります。つまり、FROMのあとに指定するテーブルと、JOINのあとに指定するテーブルの順番を変えると、結合したデータが変更する可能性があるということです。

SQL6-10、SQL6-11を実行して、JOINの順番を変えるとどうなるか、出力結果を確認してみましょう。SQL6-10では、FROMのあとが購入履歴テーブルで、JOINのあとが顧客情報テーブルになっています。一方で、SQL6-11では順番が変わっており、FROMのあとが顧客情報テーブルで、JOINのあとが購入履歴テーブルになっています。

SQL6-10のように、購入履歴テーブルをもとにして顧客情報テーブルを外部結合した場合、購入履歴テーブルにある情報はすべて残されたままになります。一方で、SQL6-11のように、顧客情報テーブルをもとにして購入履歴テーブルを外部結合した場合、顧客情報テーブルにある情報はすべて残されたままになります。

★ハンズオン〜SQLを実行してみよう〜

・SQL6-10

</>
1
2
3
4
5
SELECT
    COUNT(*)
FROM
    orders AS o
    LEFT JOIN users AS u ON o.user_id = u.user_id

・表6-20:SQL6-10の実行結果

COUNT(*)

100000

・SQL6-11

</>
1
2
3
4
5
SELECT
    COUNT(*)
FROM
    users AS u
    LEFT JOIN orders AS o ON o.user_id = u.user_id

・表6-21:SQL6-11の実行結果

COUNT(*)

100000

このように、左外部結合はどちらのテーブルをもとにするか(FROMのあとに指定するか)で、データの結果が変わる可能性があります。つまり、データ分析で左外部結合を使う場合は、結合する順番も非常に重要になります。どちらがよい悪いという話ではなく、データ分析を行う目的に応じて使い分ける必要があります。

SQL6-10は、購入履歴テーブルをもとに顧客情報テーブルを結合しているため、購入履歴テーブルのデータはすべて取得されます。しかし、購入履歴テーブルに存在せずに、顧客情報だけが存在するデータは取得されません。例えば、会員登録はしていても、実際にECサイトでは購入していないデータは、SQL6-10では取得することはできません。SQL6-10はあくまで購入履歴テーブルをもとにしたデータ取得なので、購入履歴テーブルにあるデータのみが取得されます。

一方で、SQL6-11は顧客情報テーブルをもとに購入履歴テーブルを結合しているため、顧客情報テーブルのデータはすべて取得されます。ECサイトで購入をしていなくても、顧客情報だけが登録されているデータは取得されます。しかし、会員登録しないで購入した場合など、顧客情報がない購入履歴に関しては、結合されません。SQL6-11はあくまで顧客情報をもとにしたデータ取得なので、顧客情報テーブルにあるデータのみが取得されます。

・図6-22:左外部結合の順番を変えた場合

このように、左外部結合を使う場合は、どんなデータを取得したいかによってJOINの順番に気をつける必要があります。顧客情報を取得したい場合はFROMのあとに顧客情報テーブルを指定する、購入情報を取得したい場合はFROMのあとに購入履歴テーブルを指定するなど、用途に応じてどの順番でテーブルを結合するか考えなければいけません。内部結合の場合は、両方のテーブルに共通するデータを取得するため、JOINの順番を気にする必要はありませんが、左外部結合を使う場合は、JOINの順番にも気をつけましょう。

データ分析における「JOIN」の考え方

データ分析では、テーブルの結合は非常に重要です。取得したいデータが1つのテーブルにすべて入っているということは現実的に少なく、複数のテーブルを結合させて、必要なデータを取得する場合が多いです。そのため、テーブルを結合するJOINは、データ分析でもよく利用されます。また、データ分析においてJOINでよく使うのが内部結合(INNER JOIN)と左外部結合(LEFT OUTER JOIN)です。図6-23のように、複数のテーブルを「横」に結合して出力結果を求めることがJOINで重要な考え方です。つまり、JOINは元のテーブルに新しくカラムが追加される結合方法であると覚えておきましょう。

・図6-23:JOINの考え方

JOINの考え方
JOINの考え方

演習問題

演習問題6-1

購入履歴テーブル(orders)と商品情報テーブル(products)を結合して、2023年1月1日の売上と購入件数を出力してください。また、キャンセルのある購入データは除外してください。

演習問題6-2

購入履歴テーブル(orders)と商品情報テーブル(products)を結合して、顧客ID(user_id)ごとの売上と購入件数を出力してください。条件として、キャンセルのある購入データは除外してください。また、出力結果は顧客IDごとの売上が多い順に並び替えてください。

前のレッスン

さまざまな条件でデータを取得する〜 WHERE / HAVING 〜

次のレッスン

複数のテーブルを「縦」に結合する〜 UNION 〜