01 / 05
テーブルをつなぐ
INPUT · スライド
2つの表をつなぐ
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列が items。item_id と id が同じ番号でならんでいるのを確かめてみよう。
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
どちらの表の列か言わないと怒られる
id は orders にも 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;実行結果
あさひ色のマグ こもれびランプ ひのきの箸置き まめのコースター わたのふきん