クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

2つのテーブルをつなぐ

このレッスンのあとで: 2つのテーブルをつないで、1つの問いに答えることができる。

50分のレッスンコマンドなし

この部品はどこから来たのか

あなたは、愛知県の自動車部品メーカー「三河オートパーツ」の購買部にいます。

品質管理の担当者から電話がありました。「防振ゴムの仕入先と、その県を教えてください」。

部品の表を見ると、仕入先は「2」という番号だけです。名前は、別の仕入先の表にあります。2つの表を見比べずに、1回のクエリで答えを出す方法を学びます。

このレッスンのゴール

メモ

2つのテーブルをつないで、1つの問いに答えることができる。

キーワード

ことばいみれい
主キー行を1つに決める番号です。suppliers.id
外部キー別のテーブルの主キーを指す列です。parts.supplier_id
JOIN2つのテーブルの行をつなぎます。
ONどの列とどの列が同じなら、つなぐかを決めます。
仕入先部品を買っている相手の会社です。

学生が入力するセルは、このプレビューでは空白です。

キーが2つの表を結ぶ

仕入先の表では、どの行にも重ならない番号 id があります。これが主キーです。

部品の表の supplier_id は、仕入先の id を指しています。これが外部キーです。

仕入先の名前を部品の表に何度も書かず、番号だけを書きます。こうすると、会社名が変わっても、直すのは1か所で済みます。

試そう: 2つの表を見る

コード: sql
-- 部品の表です。仕入先は番号(supplier_id)しかありません。
SELECT * FROM parts;

-- 仕入先の表です。番号(id)と名前が対応しています。
SELECT * FROM suppliers;

JOIN ... ONで行をつなぐ

FROM parts JOIN suppliers と書くと、2つの表をつなぎます。

ON parts.supplier_id = suppliers.id は、つなぐ決まりです。番号が同じ行どうしが、1行にまとまります。

列名が両方の表にあるときは、parts.name のように表の名前を前に付けます。どちらの name か、はっきりさせるためです。

試そう: 部品と仕入先をつなぐ

コード: sql
-- 部品の表と仕入先の表を、番号でつなぎます。
SELECT parts.name, suppliers.name, suppliers.prefecture
FROM parts
JOIN suppliers ON parts.supplier_id = suppliers.id;

-- つないだ後で、WHERE で静岡県の仕入先だけに絞ります。
SELECT parts.name, suppliers.name
FROM parts
JOIN suppliers ON parts.supplier_id = suppliers.id
WHERE suppliers.prefecture = '静岡県';

-- '静岡県' を '岐阜県' に変えて、もう一度実行してください。

例: 番号で行をつなぐ

部品supplier_id同じ id の仕入先県
ボルトM81東海ボルト工業愛知県
防振ゴム2浜松ゴム化成静岡県
ギア3岐阜精密岐阜県
(なし)4三河樹脂結果に出ない

学生が入力するセルは、このプレビューでは空白です。

ONがないと全部の組み合わせになる

次のクエリには ON がありません。実行して、行の数を数えてください。

部品7行と仕入先4行の、すべての組み合わせが出ます。7 × 4 = 28行です。

「ボルトM8」と「浜松ゴム化成」のように、関係のない行どうしもつながってしまいます。

試そう: ONを忘れると

コード: sql
-- ON を書き忘れた例です。何行出るか、数えてください。
SELECT parts.name, suppliers.name
FROM parts
JOIN suppliers;

よくある間違い

注意

JOIN と書けば、データベースが自動で正しくつないでくれると思いがちです。そうではありません。どの列で結ぶかは、ON で必ず自分で書きます。結果の行数が、元の表より大きく増えたら、ON を疑ってください。

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。