基本 INNER JOIN
前回のレクチャーでは、SQLでどんなJOINタイプがあるか話したよね。今日は INNER JOIN についてもっと詳しく見ていくよ。
INNER JOIN はリレーショナルデータベースでデータを結合するタイプで、2つのテーブルから行を取ってきて、君が指定した条件に「一致」する 行だけを返してくれるんだ。つまり、INNER JOIN は2つのテーブルの重なってる部分だけ返して、それ以外は無視するってこと。
例えば、君が2つの箱を持ってるとしよう。一つには学生のカード、もう一つには学生が登録したコースのカードが入ってる。どの学生がどのコースに登録してるか知りたいよね。一致しない(例えば、どこにも登録してない学生)は今は気にしない。こういうシナリオは INNER JOIN にピッタリ!
INNER JOIN のシンタックス
シンタックスはめっちゃシンプル。結合したい2つのテーブルを指定して、ON キーワードで結合条件を書くんだ。
SELECT カラムたち
FROM テーブル1 INNER JOIN テーブル2
ON テーブル1.フィールド = テーブル2.フィールド;
テーブル1とテーブル2— 君が結合したいテーブルだよ。フィールド— ここで一致させるカラム。ONの後ろの条件が、両方のテーブルの行をどうマッチさせるかを決める。
INNER JOIN の使い方例
これからの例では、2つのテーブルを使うよ:
テーブル students — 学生データ
| student_id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Anna | 22 |
| 3 | Peter | 19 |
| 4 | Dia | 21 |
テーブル enrollments — コース登録データ
| enrollment_id | student_id | course_id |
|---|---|---|
| 101 | 1 | 501 |
| 102 | 2 | 502 |
| 103 | 2 | 503 |
| 104 | 3 | 504 |
注目:学生Dia(student_id = 4)はどのコースにも登録してないよ。
例1:学生とコースの登録情報を取得する
どの学生がどのコースに登録してるか知りたい。これが INNER JOIN の典型的な使い方。students と enrollments の student_id で一致してるデータだけが大事だよ。
SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;
結果:
| name | course_id |
|---|---|
| Otto | 501 |
| Anna | 502 |
| Anna | 503 |
| Peter | 504 |
どう?INNER JOIN はコースに登録してる学生だけ返してるよ。どこにも登録してないDiaは結果に出てこない。
例2:注文と顧客を取得する
次は別の例。orders(注文)と customers(顧客)のテーブルがあるとしよう。全部の注文と顧客名をリストアップしたい。
テーブル orders
| order_id | customer_id | amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
テーブル customers
| customer_id | name |
|---|---|
| 101 | Otto |
| 102 | Anna |
| 104 | Peter |
タスク:orders と customers を customer_id で結合して、対応する顧客がいる注文だけ返したい。
SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;
結果:
| order_id | name | amount |
|---|---|---|
| 1 | Otto | 500 |
| 2 | Anna | 300 |
注目してね、order_id = 3 の注文は結果に出てこない。なぜなら customer_id = 103 の顧客は customers テーブルに存在しないから。
INNER JOIN でテーブルを結合する方法(そして何がうまくいかないかも)
INNER JOIN はリレーショナルデータベースを使うプロジェクトならほぼ必須のツール。ツールボックスのスパナみたいなもんで、これ無しでやろうとするとめっちゃ大変。例えば:
- 複数テーブルのデータを組み合わせてレポートを作るとき。
- 分析で、ファクトとディメンション(例:売上と顧客)を結合したいとき。
- 外部システムのデータを統合したいとき。
初心者が一番やりがちなミスは ON を忘れるか、結合条件を間違えること。正しい条件を指定しないと、期待した結果じゃなくて、デカルト積(2つのテーブルの全組み合わせ)が返ってきちゃう。これ、何千・何百万行にもなって意味不明なデータになるよ。
ミスの例:
この例では結合条件がないから、2つのテーブルの全ての行の組み合わせができちゃう(たぶん、君が欲しい結果じゃないよね):
SELECT students.name, enrollments.course_id
FROM students, enrollments; -- ミス:結合条件がない!
結果はカオスになるよ:students の各行が enrollments の各行と全部組み合わさる。
GO TO FULL VERSION