テーブルをつなぐ

INPUT · スライド

2つの表をつなぐ

01 / 05

全部の行をつなぎたい

サブクエリでたどれるのは1件ずつだった。でも本当にほしいのは「注文の全部に商品名がくっついた表」だよね。

それをやるのが JOIN(結合)。2つの表を鍵でつなぎ、1つの結果として返してくれるよ。

02 / 05

`JOIN` と `ON` の形

FROM のうしろに JOIN もう1つの表 を足し、ONどの列が同じなら同じものかを書く。この ON に書く条件が鍵だよ。

2つの表に同じ名前の列があるので、列は テーブル名.カラム名 で指す。どちらの表の列かをはっきりさせる書き方だよ。

SELECT items.name, orders.quantity  FROM orders  JOIN items  ON orders.item_id = items.id;

実行結果

ひのきの箸置き | 2
わたのふきん | 4
あさひ色のマグ | 4
こもれびランプ | 1
まめのコースター | 3
ひのきの箸置き | 2
わたのふきん | 2
あさひ色のマグ | 3
まめのコースター | 6

03 / 05

横につながっているのを見る

* にすると、結合が何をしたのか見える。注文の行のうしろに、対応する商品の行がくっついた1行になっているよ。

左の5列が orders、右の4列が itemsitem_idid が同じ番号でならんでいるのを確かめてみよう。

SELECT * FROM orders  JOIN items  ON orders.item_id = items.id;

実行結果

1 | 1 | 1 | 2 | アプリ | 1 | ひのきの箸置き | 480 | 食卓
2 | 3 | 2 | 4 | ウェブ | 3 | わたのふきん | 340 | キッチン
3 | 2 | 1 | 4 | 店頭 | 2 | あさひ色のマグ | 1600 | 食卓
4 | 4 | 3 | 1 | アプリ | 4 | こもれびランプ | 3800 | あかり
5 | 5 | 4 | 3 | ウェブ | 5 | まめのコースター | 260 | 食卓
6 | 1 | 3 | 2 | ウェブ | 1 | ひのきの箸置き | 480 | 食卓
7 | 3 | 4 | 2 | アプリ | 3 | わたのふきん | 340 | キッチン
8 | 2 | 2 | 3 | アプリ | 2 | あさひ色のマグ | 1600 | 食卓
9 | 5 | 1 | 6 | 店頭 | 5 | まめのコースター | 260 | 食卓

04 / 05

どちらの表の列か言わないと怒られる

idorders にも items にもある。どちらか言わずに id と書くと、SQLは決められずにエラーを返すよ。

ambiguous column name: id は「id がどっちの id か分からない」という意味。orders.id のようにテーブル名を付ければ解決するよ。

SELECT id, name FROM orders  JOIN items  ON orders.item_id = items.id;

実行結果

ambiguous column name: id

05 / 05

つながらない行は出てこない

JOIN の結果に出てくるのは、鍵が一致した行だけ。一度も注文されていない商品は、orders に相手がいないので結果に現れないんだ。

下は結合した結果から商品名を重複なしで取り出したもの。6つあるはずの商品が5つしかないのが分かるね。この性質は次の節でくわしく扱うよ。ここから書いてみよう。

SELECT DISTINCT items.name  FROM orders  JOIN items  ON orders.item_id = items.id  ORDER BY items.name;

実行結果

あさひ色のマグ
こもれびランプ
ひのきの箸置き
まめのコースター
わたのふきん