CodeGym /コース /SQL SELF /基本 INNER JOIN

基本 INNER JOIN

SQL SELF
レベル 11 , レッスン 1
使用可能

基本 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 の典型的な使い方。studentsenrollmentsstudent_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

タスクorderscustomerscustomer_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 の各行と全部組み合わさる。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION