テーブルをつなぐ

INPUT · スライド

注文の表を読む

01 / 05

表はひとつじゃない

ここまでは、いつも1つの表だけを見てきた。でも本物のアプリのデータは、いくつもの表に分かれてしまわれているんだ。

この章では手作り雑貨のお店を題材に、「注文」「商品」「会員」の3つの表を行き来する。最後には表と表をつないで1つの結果にできるようになるよ。

02 / 05

注文の表

まず使うのは orders テーブル。注文1件が1レコードだよ。

  • id … 注文の番号
  • item_id … 何を買ったか
  • member_id … だれが買ったか
  • quantity … いくつ買ったか
  • channel … どこから注文したか
SELECT * FROM orders;

実行結果

1 | 1 | 1 | 2 | アプリ
2 | 3 | 2 | 4 | ウェブ
3 | 2 | 1 | 4 | 店頭
4 | 4 | 3 | 1 | アプリ
5 | 5 | 4 | 3 | ウェブ
6 | 1 | 3 | 2 | ウェブ
7 | 3 | 4 | 2 | アプリ
8 | 2 | 2 | 3 | アプリ
9 | 5 | 1 | 6 | 店頭

03 / 05

番号しか入っていない列

item_idmember_id をよく見ると、番号しか入っていない。商品名も会員名もこの表にはないんだ。

つまりいまは「3番の商品が4つ売れた」までしか読めない。名前は別の表にしまってあるからだよ。ここをつなぐのが、この章の目標。

SELECT * FROM orders  WHERE channel = '店頭';

実行結果

3 | 2 | 1 | 4 | 店頭
9 | 5 | 1 | 6 | 店頭

04 / 05

今までの道具はそのまま使える

表が変わっても WHERE ORDER BY LIMIT の使い方は同じ。列を選び、行を絞り、並べて、件数を決める——覚えた形がそのまま通じるよ。

SELECT id, quantity FROM orders  ORDER BY quantity DESC  LIMIT 3;

実行結果

9 | 6
2 | 4
3 | 4

05 / 05

集計も同じように使える

GROUP BY も同じ。channel ごとに quantity を合計すれば、どこからの注文がよく動いているか分かるね。

この節は復習だけ。新しい書き方は出てこないから、手を慣らしてから次に進もう。ここから書いてみよう。

SELECT channel, SUM(quantity)  FROM orders  GROUP BY channel;

実行結果

アプリ | 8
ウェブ | 9
店頭 | 10