主キー・外部キー・リレーション: テーブル同士のつながりを読む
Stage 3 — 第1章 | データ分析基礎カリキュラム 推定学習時間:30〜40分 | 難易度:★★☆☆☆
この章で学ぶこと
Stage 1では、1つのテーブルから必要な列や行を取り出す方法を学びました。 しかし実務のデータ分析では、必要な情報が1つのテーブルにまとまっているとは限りません。
ECサイトなら、顧客情報は customers、注文情報は orders、商品情報は products のように分かれて保存されることが多いです。
これらを正しくつなぐために必要なのが、主キー、外部キー、リレーション の考え方です。
この章を終えると、こんなことができるようになります:
- 主キーと外部キーの役割を説明できる
- テーブルを分けて保存する理由を理解できる
- どの列を使ってテーブルをつなぐか判断できる
- JOINを学ぶ前提として、テーブル同士の関係を読める
1. なぜテーブルは分かれているのか
ECサイトの分析では、次のような情報を扱います。
| 知りたいこと | 必要な情報 |
|---|---|
| 誰が購入したか | 顧客情報 |
| いつ注文したか | 注文情報 |
| 何を買ったか | 注文明細 |
| 商品のカテゴリは何か | 商品情報 |
これらをすべて1つの巨大な表に入れると、同じ顧客名や商品名が何度も繰り返されます。 更新ミスも起きやすくなります。
そのため、データベースでは役割ごとにテーブルを分けます。
| テーブル | 1行が表すもの | 主な列 |
|---|---|---|
customers |
顧客1人 | customer_id, customer_name, prefecture |
orders |
注文1件 | order_id, customer_id, order_date, status |
order_items |
注文明細1行 | order_id, product_id, quantity, unit_price |
products |
商品1つ | product_id, product_name, category, price |
分析では、分かれて保存されたテーブルを必要に応じてつなぎます。 そのための基本がJOINです。
2. 主キーは「その行を一意に見分ける列」
主キーは、テーブル内の1行を一意に識別するための列です。 英語では primary key と呼ばれます。
たとえば customers テーブルでは、customer_id が主キーになります。
| customer_id | customer_name | prefecture |
|---|---|---|
| C001 | Aさん | 東京都 |
| C002 | Bさん | 大阪府 |
| C003 | Cさん | 福岡県 |
customer_id が分かれば、どの顧客かを1人に特定できます。
同じ名前の顧客がいても、IDが違えば別の顧客として扱えます。
ECデータでは、次のような列が主キーとして使われます。
| テーブル | 主キーの例 |
|---|---|
customers |
customer_id |
orders |
order_id |
products |
product_id |
主キーは、後でテーブルをつなぐときの基準になります。
3. 外部キーは「別テーブルの行を指す列」
外部キーは、別のテーブルの主キーを参照する列です。 英語では foreign key と呼ばれます。
たとえば orders テーブルには customer_id があります。
| order_id | customer_id | order_date | total_amount |
|---|---|---|---|
| O001 | C001 | 2026-01-05 | 5200 |
| O002 | C002 | 2026-01-06 | 9800 |
| O003 | C001 | 2026-01-10 | 3400 |
ここで orders.customer_id は、customers.customer_id を指しています。
つまり「この注文はどの顧客のものか」を表します。
| 外部キー | 参照先 | 意味 |
|---|---|---|
orders.customer_id |
customers.customer_id |
注文した顧客 |
order_items.order_id |
orders.order_id |
明細が属する注文 |
order_items.product_id |
products.product_id |
明細の商品 |
JOINでは、このような対応する列を使ってテーブルをつなぎます。
4. リレーションはテーブル同士の関係
リレーションは、テーブル同士がどのようにつながっているかを表す考え方です。 ECデータでは、次のような関係があります。
| 関係 | 説明 |
|---|---|
| 顧客と注文 | 1人の顧客は複数の注文を持つことがある |
| 注文と注文明細 | 1つの注文には複数の商品明細が入ることがある |
| 商品と注文明細 | 1つの商品は複数の注文で買われることがある |
たとえば「東京都の顧客が買った商品のカテゴリを知りたい」とします。 この問いに答えるには、1つのテーブルだけでは足りません。
- 顧客の都道府県は
customersにある - 注文日は
ordersにある - 購入数量は
order_itemsにある - 商品カテゴリは
productsにある
このように、分析したい問いが複数テーブルにまたがるときにJOINが必要になります。
5. つなぐ列を間違えると結果も間違う
JOINでは、どの列とどの列を対応させるかが重要です。 たとえば顧客と注文をつなぐなら、次の対応を使います。
SELECT
customers.customer_id,
customers.customer_name,
orders.order_id,
orders.order_date
FROM customers
JOIN orders
ON customers.customer_id = orders.customer_id;
ON customers.customer_id = orders.customer_id が、テーブル同士のつなぎ方です。
列名が同じでも、意味が違う列をつなぐと誤った結果になります。 また、IDではなく名前でつなぐと、同姓同名や表記ゆれで結果がずれることがあります。
分析では、まず次の順番で確認しましょう。
- 各テーブルの1行が何を表すか確認する
- 主キーにあたる列を確認する
- 外部キーにあたる列を確認する
- どの列でJOINするか決める
実務での使いどころ: JOIN前にテーブルの地図を読む
主キーと外部キーは、テーブル同士を安全につなぐための地図です。 分析でJOINを始める前に、どの列が一意で、どの列が別テーブルを参照しているかを確認します。
| テーブル | 主キーの例 | 外部キーの例 |
|---|---|---|
customers |
customer_id |
なし |
orders |
order_id |
customer_id |
order_items |
order_id, product_id |
order_id, product_id |
products |
product_id |
なし |
JOIN条件を間違えると、行数が不自然に増えたり、関係ないデータがつながったりします。 特に、名前が似ている列をなんとなくつなぐのは危険です。
SELECT COUNT(*) AS joined_rows
FROM orders AS o
JOIN customers AS c
ON o.customer_id = c.customer_id;
JOINした後は、行数やサンプル行を確認して、想定した関係になっているかを見ましょう。
ミニ演習
次のJOINで、つなぐ列を考えてください。
- 顧客と注文をつなぐ。
- 注文と注文明細をつなぐ。
- 注文明細と商品をつなぐ。
- JOIN条件を間違えたときに起きる問題を説明する。
まとめ
| 用語 | 意味 | ECデータの例 |
|---|---|---|
| 主キー | そのテーブルの1行を一意に見分ける列 | customers.customer_id |
| 外部キー | 別テーブルの主キーを参照する列 | orders.customer_id |
| リレーション | テーブル同士の関係 | 顧客1人に注文が複数ある |
| JOIN | 関係する列を使ってテーブルをつなぐ操作 | 顧客と注文をつなぐ |
この章のキーメッセージ: JOINは、分かれて保存されたデータを分析目的に合わせて組み合わせるための基本です。SQLを書く前に、主キー・外部キー・1行の意味を確認しましょう。
この章の確認
- 主キーと外部キーの違いを説明してください。
orders.customer_idは、どのテーブルのどの列を参照していると考えられますか?- 「顧客の都道府県別に売上を見たい」とき、どのテーブルをつなぐ必要がありますか?
- テーブルをJOINする前に、なぜ「1行が何を表すか」を確認する必要がありますか?