CHAPTER 3 · 11 LESSONS · 140 問

テーブルをつなぐ

別々の表を関係づけて1つの結果にする。実際のアプリのデータはこう分かれている。

ここまでは、ひとつの表だけを相手にしてきた。でも実際のアプリのデータベースをのぞくと、表がいくつも入っている。なぜ1つにまとめないのだろう。

貸出の記録を1つの表で持つことを考えてみよう。「誰が」「どの本を」「いつ借りたか」。会員の名前と住所と電話番号を、貸出1件ごとに書くことになる。同じ人が10回借りれば、同じ名前と住所が10回書かれる。ここで問題が起きるよ。

  • 住所が変わったら、10か所すべてを直さなければならない
  • 1か所直し忘れると、どちらが正しいのか分からなくなる
  • 同じ情報が何度も保存されて、無駄に場所を食う

だから表を分ける。会員の情報は会員の表に1回だけ書き、貸出の表には「どの会員か」を指す印だけを置く。この印が id で、表と表をつなぐ手がかりになるよ。この分け方は、データベース設計のいちばん基本的な考え方だ。

そして分けたものを、見るときにまたつなぐ。それがこの章で学ぶ 結合 だよ。「貸出の表と会員の表を、会員 id が一致するところでつないで」と書くと、貸出の記録に会員の名前がくっついた1枚の表ができあがる。

結合には種類がある。この違いがこの章のいちばんの山場だよ。

  • 両方にそろっているものだけ をつなぐやり方
  • 片方は全部残して、相手がいないところは空にするやり方

たとえば「一度も借りていない会員も含めて、全会員の貸出回数を出す」には後者が要る。前者で書くと、借りたことのない人は結果から消えてしまう。「0件の人が消える」というのは集計でとてもよくある間違いなので、意識して使い分けよう。

結合は3つ以上の表にも広げられる。貸出と会員と本を全部つないで、「誰がどの本をいつ借りたか」を1枚にする。実際のアプリの画面の裏では、こういうクエリが動いているよ。

結合を書くときに面倒なのが、同じ名前のカラムが両方の表にある場合だよ。どちらの id の話をしているのか分からなくなる。そこで、表に短い別名をつけて「この表の id」と明示する書き方を覚える。ひと手間だけれど、これをやっておくと長いクエリでも読み返せるようになる。

つまずきやすいのは、つなぐ条件を書き忘れることだ。条件なしでつなぐと、片方の全行に対してもう片方の全行が組み合わさって、とんでもない行数の結果が出てくる。100行と100行で1万行だよ。結果の件数が明らかにおかしいときは、まずここを疑おう。

理解のコツをひとつ。結合は、まず1枚の大きな表ができあがると考えると分かりやすい。つないだ結果の表を思い浮かべて、そこから絞り込み、そこで集計する。頭の中で処理の順番を追いかけるより、「つないだ後の表はどんな形か」を想像するほうが早いよ。

つなぐ相手は3つ以上でもいいし、同じ表を自分自身につなぐこともできる。「この社員の上司は誰か」のように、同じ表の中で関係をたどりたいときに使う書き方だよ。少し頭がねじれるけれど、考え方はこれまでと同じだ。

この章の内容は、自分でアプリを作るときの設計にも直結する。テーブルをどう分けるかを決めるのは、アプリを作る最初の段階の仕事だよ。ここで「なぜ分けるのか」を理解しておくと、いざ自分でデータベースを設計するときに手が動く。

ここまで来ると、SQL は「表から取り出す道具」から「バラバラに保管されたデータを組み立てて答えを作る道具」に変わる。前の章で覚えた集計と組み合わせれば、答えられる問いは一気に広がるよ。

この章のレッスン

複数の表を合わせる

  1. 28注文の表を読む章を通して使う orders テーブルを眺めて、ここまでの取り出し方と集計をおさらいしよう。 問題へ
  2. 29クエリの中にクエリカッコの中に別の SELECT を書いて、その結果をそのまま条件に使おう。 問題へ
  3. 30別名をつけて読みやすくAS で列や計算結果に名前をつけて、結果の見出しを分かりやすくしよう。 問題へ
  4. 31商品の表が別にある商品名と値段は items テーブルにある。データが表に分かれている様子を見てみよう。 問題へ
  5. 32つなぐ鍵をさがすorders の item_id と items の id が同じものを指している。表をつなぐ鍵を見つけよう。 問題へ
  6. 332つの表をつなぐJOIN と ON を使って、注文と商品を1つの結果としてつなげよう。 問題へ
  7. 34つないでから絞る・数える結合した結果に WHERE / ORDER BY / GROUP BY を重ねて、売れゆきを読み解こう。 問題へ
  8. 35会員の表を足すmembers テーブルを加えて、3つの表がどうつながっているか見取り図で確かめよう。 問題へ
  9. 36片方の表を残してつなぐLEFT JOIN で左の表の行を全部残そう。相手がいないところは NULL になる。 問題へ
  10. 373つの表をつなぐJOIN を2つ続けて書いて、注文・商品・会員を1つの結果にまとめよう。 問題へ
  11. 38テーブルをつなぐ 総合演習章のまとめ。基礎問題はなく、練習10問でサブクエリ・別名・結合を組み合わせて解こう。 問題へ

つぎは「実データで分析する」。売上や利用者のデータに、ここまでの書き方を組み合わせて答えを出す。