今日はリレーショナルデータベースで一番面白いテーマの一つ、JOINを使って複数のテーブルからデータを結合する話に入るよ。これはマジで強力なツールで、複雑な関係や分析を作る扉を開いてくれるんだ。
イメージしてみて、君のデータベースは巨大なコミックみたいなもので、バラバラのテーブルがそれぞれコマになってる。ストーリーを完成させるには、そのコマを繋げなきゃいけない。そこでJOINの出番!データ結合っていうのは、複数のテーブルから情報を引っ張ってきて、指定した条件で繋げるプロセスなんだ。
リレーショナルデータベースはテーブル同士の関係というコンセプトを中心に作られてる。それぞれのテーブルは特定のエンティティの情報を持ってて、もっと全体像を知りたい時は他のテーブルのデータと繋げたくなるよね。例えば:
studentsテーブルは学生のリスト。coursesテーブルはコースのリスト。enrollmentsテーブルは誰がどのコースを受けてるかを示してる。
どの学生がどのコースを受けてるか知りたかったら、これらのテーブルを繋げる必要がある。面接でもJOINを使いこなせるエンジニアは頼もしく見えるし、データ仕事で超重要なスキルなんだ。
JOINの主な種類
PostgreSQLにはいくつかのJOINの種類があって、それぞれ特定の用途に向いてる。難しい例で頭を悩ませる前に、ざっくり全体像を見てみよう:
| JOINのタイプ | 説明 |
|---|---|
INNER JOIN |
両方のテーブルで一致する行だけ返す。 |
LEFT JOIN |
左側のテーブルの全行と、右側は一致するものだけ返す。 |
RIGHT JOIN |
右側のテーブルの全行と、左側は一致するものだけ返す。 |
FULL OUTER JOIN |
両方のテーブルの全行を返して、一致しない部分はNULLで埋める。 |
どのJOINを使うかは、やりたいこと次第:
- 両方のテーブルで一致するデータだけ欲しいなら
INNER JOINを使おう。 - 片方のテーブルの全データを残して、もう片方は一致するものだけ欲しいなら
LEFT JOINかRIGHT JOINがいいよ。 - 両方のテーブルの全データが欲しい(たとえ一致しなくても)なら
FULL OUTER JOINを使おう。
じゃあ、これらのJOINを実際に使ってみよう!
例題 — 「誰がどのコース?」
例えば、こんな3つのテーブルがあるとする:
studentsテーブル
| id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
coursesテーブル
| id | title |
|---|---|
| 101 | 数学 |
| 102 | 英語 |
enrollmentsテーブル
| student_id | course_id |
|---|---|
| 1 | 101 |
| 2 | 102 |
これらのテーブルはこんな感じで繋がってる:
studentsのidフィールドは学生のユニークID。coursesのidフィールドはコースのユニークID。enrollmentsテーブルのstudent_idとcourse_idカラムが学生とコースを繋げてる。
例えば、「どの学生がどのコースに登録してる?」って知りたいとする。
この答えはJOINで出せる。テーブル同士の関係を使って繋げていくよ:
studentsとenrollmentsをid = student_idで繋げる。enrollmentsとcoursesをcourse_id = idで繋げる。
SQLクエリはこんな感じ:
SELECT students.name, courses.title
FROM enrollments
JOIN students ON enrollments.student_id = students.id
JOIN courses ON enrollments.course_id = courses.id;
このクエリがやってること:
FROM enrollments— 学生とコースを繋げるテーブルから始める。JOIN students ON enrollments.student_id = students.id— 学生を結合して名前を取得。JOIN courses ON enrollments.course_id = courses.id— コースを結合してタイトルを取得。
結果はこんな感じになる:
| name | title |
|---|---|
| Otto | 数学 |
| Anna | 英語 |
注意してね:もし学生がどのコースにも登録してなかったら、結果に出てこないよ。なぜならJOINはデフォルトで厳密(INNER JOIN)だから。あとでLEFT JOINを使って、そういう学生も含める方法を説明するね。
もしこのクエリで分からないところがあっても大丈夫!少しずつ理解していくのが次のレクチャーの目標だから!
これって現実世界で何に使うの?
テーブルの繋げ方が分かったところで、リアルな話をしよう。ネットショップがどう動いてるか考えたことある?例えばスマホを選んで、他のユーザーのレビューが見れるよね。
productsテーブルは商品の情報。reviewsテーブルはお客さんのレビュー。customersテーブルはお客さん自身の情報。
サイトでレビューを表示するには、products、reviews、customersのテーブルを結合しなきゃいけない。これがまさにJOINの実例だよ。
どこに気をつける?
次のレクチャーでJOINをもっと深掘りする前に、覚えておいてほしいポイントをいくつか:
JOINの順番は大事。 例えばLEFT JOINは左側のテーブルの行を返すから、順番を変えると結果も変わるよ。- 小さいテーブルで練習しよう。 最初は何百万行もあるテーブルは避けて。シンプルなクエリでも分かりやすさが大事!
- 関係を意識するクセをつけよう。 テーブルを大きな構造の一部として見るのに慣れると、
JOINも自然に使えるようになるよ。
今日からSQLスペシャリストへの道が始まる!次のレクチャーではINNER JOINを使って2つのテーブルからデータを取り出す方法を学ぶよ。これはPostgreSQLを学ぶ上で大きな一歩になるはず!
GO TO FULL VERSION