この部品はどこから来たのか
あなたは、愛知県の自動車部品メーカー「三河オートパーツ」の購買部にいます。
品質管理の担当者から電話がありました。「防振ゴムの仕入先と、その県を教えてください」。
部品の表を見ると、仕入先は「2」という番号だけです。名前は、別の仕入先の表にあります。2つの表を見比べずに、1回のクエリで答えを出す方法を学びます。
このレッスンのゴール
メモ
2つのテーブルをつないで、1つの問いに答えることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 主キー | 行を1つに決める番号です。 | suppliers.id |
| 外部キー | 別のテーブルの主キーを指す列です。 | parts.supplier_id |
| JOIN | 2つのテーブルの行をつなぎます。 | |
| ON | どの列とどの列が同じなら、つなぐかを決めます。 | |
| 仕入先 | 部品を買っている相手の会社です。 |
学生が入力するセルは、このプレビューでは空白です。
キーが2つの表を結ぶ
仕入先の表では、どの行にも重ならない番号 id があります。これが主キーです。
部品の表の supplier_id は、仕入先の id を指しています。これが外部キーです。
仕入先の名前を部品の表に何度も書かず、番号だけを書きます。こうすると、会社名が変わっても、直すのは1か所で済みます。
試そう: 2つの表を見る
-- 部品の表です。仕入先は番号(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 か、はっきりさせるためです。
試そう: 部品と仕入先をつなぐ
-- 部品の表と仕入先の表を、番号でつなぎます。
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 の仕入先 | 県 |
|---|---|---|---|
| ボルトM8 | 1 | 東海ボルト工業 | 愛知県 |
| 防振ゴム | 2 | 浜松ゴム化成 | 静岡県 |
| ギア | 3 | 岐阜精密 | 岐阜県 |
| (なし) | 4 | 三河樹脂 | 結果に出ない |
学生が入力するセルは、このプレビューでは空白です。
ONがないと全部の組み合わせになる
次のクエリには ON がありません。実行して、行の数を数えてください。
部品7行と仕入先4行の、すべての組み合わせが出ます。7 × 4 = 28行です。
「ボルトM8」と「浜松ゴム化成」のように、関係のない行どうしもつながってしまいます。
試そう: ONを忘れると
-- ON を書き忘れた例です。何行出るか、数えてください。
SELECT parts.name, suppliers.name
FROM parts
JOIN suppliers;
よくある間違い
注意
JOIN と書けば、データベースが自動で正しくつないでくれると思いがちです。そうではありません。どの列で結ぶかは、ON で必ず自分で書きます。結果の行数が、元の表より大きく増えたら、ON を疑ってください。