本文へスキップ
BecomeCoder

SQL データ操作 (DML)コース · 第3章 テーブルをつなぐ · レッスン10

JOIN ― 2つの表を結びつける

ブラウザで完結

導入

orders を見ても、そこにあるのは user_id という番号だけ。「これは誰の注文?」を知るには users を見に行く必要があります。この2つの表を、対応する行どうしで横につなげるのが JOIN です。

説明

JOIN は「つなぐ相手の表」を書き、ON で「どの列とどの列が一致したらつなぐか」を指定します。ここでは orders.user_idusers.id が同じ行どうしを結びます。

flowchart LR
    subgraph O["orders"]
        O1["user_id = 1 / 注文1"]
        O2["user_id = 2 / 注文3"]
    end
    subgraph U["users"]
        U1["id = 1 / 佐藤"]
        U2["id = 2 / 鈴木"]
    end
    O1 -->|"ON o.user_id = u.id"| U1
    O2 -->|"ON o.user_id = u.id"| U2
    U1 --> R["結果: 佐藤 / 注文1<br/>鈴木 / 注文3 …"]
    U2 --> R

列名は テーブル名.列名 の形で書くと、どちらの表の列か明確になります。テーブル名が長いと大変なので、AS で短い**別名(エイリアス)**を付けるのが一般的です(orders AS ousers AS u)。

SELECT u.name, o.id, o.ordered_at
FROM orders AS o
JOIN users AS u ON o.user_id = u.id;

これで「注文に会員名がくっついた表」が得られます。ただの JOIN(正式には INNER JOIN/内部結合)は、「両方の表で一致する行だけ」を返します。相手の見つからない行は結果に出ません。

JOIN は集計とも組み合わせられます。「会員ごとの注文件数」はこう書けます。

SELECT u.name, COUNT(*) AS 注文数
FROM orders AS o
JOIN users AS u ON o.user_id = u.id
GROUP BY u.name;

やってみよう

初期表示のクエリを実行して、各注文に会員名が並ぶことを確認しましょう。次に、categoriesproductsJOIN して「商品にカテゴリ名を並べる」ことに挑戦してみてください(SELECT p.name, c.name FROM products AS p JOIN categories AS c ON p.category_id = c.id;)。

演習

JOIN を使って、**各注文の「会員名(users.name)」と「注文日(orders.ordered_at)」**を並べて取り出してください。

ヒント1を見る

ordersusersON o.user_id = u.id でつなぎ、u.nameo.ordered_at を選びます。

ヒント2を見る

SELECT u.name, o.ordered_at FROM orders AS o JOIN users AS u ON o.user_id = u.id;

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。