データベース ・ Chapter 6
JOIN テーブルを繋ぐ
記事 ・ 冒頭を無料公開中
このコース最初の山場です。ここまでusersとproductsは別々に触ってきましたが、実際のサービスのデータはテーブルをまたいで意味を持ちます。「誰が」「何を」買ったのか。この章では、分かれたテーブルを繋いで1枚の表として取り出すJOINを学びます。ここを越えると、SQLで表現できる世界が一気に広がります。
概要
今回から注文テーブルが加わります。シードを読んでください(だいぶ長くなりましたが、全部読める文法のはずです)。
ordersの中身を見てください。
| id | user_id | product_id | quantity |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 4 | 2 |
| 3 | 2 | 7 | 3 |
| 4 | 4 | 2 | 1 |
| 5 | 6 | 4 | 1 |
| 6 | 6 | 5 | 1 |
名前がひとつも書かれていません。あるのは番号だけ。user_idの1は「usersテーブルのid 1の人(田中さん)」、product_idの1は「productsのid 1(ワイヤレスイヤホン)」を指しています。このように他のテーブルの主キーを指す列を外部キーと呼びます。
なぜ名前を直接書かず、番号で指すのか。もしordersに「田中」と名前で書いてしまうと、田中さんが改名したとき全注文を書き換える必要があり、同姓の別人と区別もつきません。データの実体は1箇所(users)に置き、他の場所からは番号で指す。これがリレーショナルデータベースの根本の設計思想です。そして「番号だけの表は人間には読みにくい」という当然の問題を解決するのが、JOINです。
JOIN——番号を突き合わせて、表を繋ぐ
SELECT * FROM orders
JOIN users ON orders.user_id = users.id;
読み下すと「ordersに、usersを繋ぐ。繋ぎ方は、ordersのuser_idとusersのidが一致する行同士をくっつける」。ONの後ろが突き合わせの条件です。
▶ 実行してみよう
結果を眺めてください。ordersの6行それぞれの右側に、対応するユーザーの行がまるごとくっついています。注文2件の田中さんは2行に登場し、注文のない高橋さん・伊藤さんは1行も登場しません。「一致する行同士をくっつける」の意味が、この結果に全部出ています。
列を選ぶ テーブル名.列名
- だと列が多すぎるので、欲しい列だけ選びます。繋いだ表では同じ名前の列が両方にある(ordersのidとusersのid、など)ため、テーブル名.列名 の形でどちらの列かを明示します。
このチャプターの続きは受講生限定です
本文の残り、図解・実行できるコードブロック・演習はプラン加入後に読めます。