テーブルをつなぐ

INPUT · スライド

3つの表をつなぐ

01 / 04

`JOIN` は続けて書ける

「だれが何を買ったか」を1つの表にするには、ordersitemsmembers両方をつなぐ必要がある。

やり方は簡単で、JOIN … ON …もう1組足すだけ。上から順にくっついていくと思えばいいよ。

SELECT orders.id, items.name,  members.name  FROM orders  JOIN items  ON orders.item_id = items.id  JOIN members  ON orders.member_id = members.id  ORDER BY orders.id;

実行結果

1 | ひのきの箸置き | みなと
2 | わたのふきん | すずな
3 | あさひ色のマグ | みなと
4 | こもれびランプ | かえで
5 | まめのコースター | いつき
6 | ひのきの箸置き | かえで
7 | わたのふきん | いつき
8 | あさひ色のマグ | すずな
9 | まめのコースター | みなと

02 / 04

見出しが同じ名前で並んでしまう

さっきの結果、2列目と3列目の見出しはどちらも name になっている。商品名と会員名の区別が付かないよね。

ここで AS が効いてくる。どちらの name か分かる別名を付けておこう。

SELECT items.name AS item,  members.name AS buyer,  orders.quantity  FROM orders  JOIN items  ON orders.item_id = items.id  JOIN members  ON orders.member_id = members.id  ORDER BY orders.id;

実行結果

ひのきの箸置き | みなと | 2
わたのふきん | すずな | 4
あさひ色のマグ | みなと | 4
こもれびランプ | かえで | 1
まめのコースター | いつき | 3
ひのきの箸置き | かえで | 2
わたのふきん | いつき | 2
あさひ色のマグ | すずな | 3
まめのコースター | みなと | 6

03 / 04

テーブル名を省くとエラー

3つつなぐと、name を持つ表が2つになる。だから name だけ書くとどっちか決められず、エラーになるよ。

ambiguous column name: name は「name があいまい」という意味。結合したらテーブル名を必ず付ける——これで防げるよ。

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

実行結果

ambiguous column name: name

04 / 04

3つつないだ結果を集計する

結合した結果は1つの表。だから3つつないだあとでも GROUP BY はそのまま使えるよ。

下は「町ごとの売上」。値段は items、個数は orders、町は members にある——3つの表がそろって初めて出せる答えだよ。ここから書いてみよう。

SELECT members.city,  SUM(items.price * orders.quantity)    AS sales  FROM orders  JOIN items  ON orders.item_id = items.id  JOIN members  ON orders.member_id = members.id  GROUP BY members.city  ORDER BY sales DESC;

実行結果

あおば市 | 13680
ひなた町 | 6160
みずうみ市 | 1460