データベース ・ Chapter 6

JOIN テーブルを繋ぐ

記事 ・ 冒頭を無料公開中

このコース最初の山場です。ここまでusersとproductsは別々に触ってきましたが、実際のサービスのデータはテーブルをまたいで意味を持ちます。「誰が」「何を」買ったのか。この章では、分かれたテーブルを繋いで1枚の表として取り出すJOINを学びます。ここを越えると、SQLで表現できる世界が一気に広がります。

概要

今回から注文テーブルが加わります。シードを読んでください(だいぶ長くなりましたが、全部読める文法のはずです)。

ordersの中身を見てください。

iduser_idproduct_idquantity
1111
2142
3273
4421
5641
6651

名前がひとつも書かれていません。あるのは番号だけ。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、など)ため、テーブル名.列名 の形でどちらの列かを明示します。

このチャプターの続きは受講生限定です

本文の残り、図解・実行できるコードブロック・演習はプラン加入後に読めます。

料金プランを見る