404 Not Found

404 Not Found


nginx

MySQLのジョイン完全ガイド

JOINはリレーショナルデータベースの中核となる機能であり、複数のテーブルを結合して初めて、その真価が発揮される。

このレッスンでは、すべてのJOINの種類とその実用的な活用法について、体系的に解説します。

1. 学習内容


2. マルチテーブルクエリに関する実話

(1) 課題:データが複数のテーブルに分散している

注文データはordersテーブルに、顧客名はcustomersテーブルに格納されています。

「各注文に関連付けられた顧客名」を特定するには、結合クエリを実行する必要があります。

(2) JOIN の解決策

SQL
SELECT 
    o.id AS order_id,
    c.name AS customer_name,
    o.amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;

3. JOIN タイプの概要

100%
graph LR
    A[JOIN Type] --> B[INNER JOIN]
    A --> C[LEFT JOIN]
    A --> D[RIGHT JOIN]
    A --> E[CROSS JOIN]
    B --> F[Return only matching rows]
    C --> G[Full Refund on the Left Table+Right Table Match]
    D --> H[Full refund as shown in the table on the right+Left Table Match]
    E --> I[Cartesian product]
JOIN タイプ 説明 返される行数
INNER JOIN 両方のテーブルで一致する行 共通部分
LEFT JOIN 左側のテーブル全体 + 右側のテーブルから一致する行 左側のテーブル全体
RIGHT JOIN 右側のテーブル全体 + 左側のテーブルから一致する行 右側のテーブル全体
CROSS JOIN デカルト積 m × n

4. INNER JOIN

両方のテーブルで一致する行のみを返す。

▶ 例:基本的なインナージョイン

SQL
-- Check Order and Customer Information
SELECT 
    o.id AS order_id,
    c.name AS customer_name,
    o.amount,
    o.order_date
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;

-- Connection of the Three Tables
SELECT 
    o.id,
    c.name,
    p.product_name,
    oi.quantity
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id;
▶ 試してみよう

5. LEFT JOIN(左外部結合)

左側のテーブルのすべての行を返します。右側のテーブルに一致する行がない場合は、NULLを返します。

▶ 例:左結合

SQL
-- Query all customers and their orders(Including customers with no orders)
SELECT 
    c.name,
    o.id AS order_id,
    o.amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
▶ 試してみよう

出力:

TEXT
+----------+----------+--------+
| name     | order_id | amount |
+----------+----------+--------+
| Alice    |        1 | 100.00 |
| Alice    |        2 | 200.00 |
| Bob      |        3 | 150.00 |
| Charlie  |     NULL |   NULL |  -- No orders
+----------+----------+--------+

▶ 例:注文履歴のない顧客を検索する

SQL
SELECT c.*
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.id IS NULL;
▶ 試してみよう

6. RIGHT JOIN(右外部結合)

右側のテーブルのすべての行を返します。左側のテーブルに一致する行がない場合は、NULLを返します。

▶ 例:右結合

SQL
-- Query all orders and their customers(Including invalid orders)
SELECT 
    c.name,
    o.id AS order_id,
    o.amount
FROM customers c
RIGHT JOIN orders o ON c.id = o.customer_id;
▶ 試してみよう
💡 ヒント: RIGHT JOIN はほとんど使われません。通常は、テーブルの順序を入れ替えることで LEFT JOIN に置き換えることができます。


7. クロス結合

デカルト積(行ごとの積)を返す。

▶ 例:クロス接続

SQL
-- Generate Colors×Size Combinations
SELECT c.color, s.size
FROM colors c
CROSS JOIN sizes s;
▶ 試してみよう

出力(3色 × 3サイズ = 9行):

TEXT
+-------+------+
| color | size |
+-------+------+
| Red   | S    |
| Red   | M    |
| Red   | L    |
| Blue  | S    |
| Blue  | M    |
| Blue  | L    |
| Green | S    |
| Green | M    |
| Green | L    |
+-------+------+

8. USING 構文

結合フィールド名が同じ場合は、USING句を使用することでクエリを簡略化できます。

▶ 例:USING を使った簡略化

SQL
-- ON Writing Style
SELECT * FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;

-- USING Simplify(The field names must be the same)
SELECT * FROM orders
INNER JOIN customers USING (customer_id);
▶ 試してみよう

9. 自己リンク

テーブルはそれ自体と関連付けられています。

▶ 例:従業員とその上司を検索する

SQL
-- The employee roster includes manager_id A field pointing to itself id
SELECT 
    e.name AS employee,
    m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
▶ 試してみよう

出力:

TEXT
+----------+---------+
| employee | manager |
+----------+---------+
| Alice    | NULL    |  -- CEO,No superior
| Bob      | Alice   |
| Charlie  | Alice   |
| Dave     | Bob     |
+----------+---------+

10. JOINの最適化の基礎

最適化戦略 説明
結合フィールドにインデックスを付ける ON o.customer_id = c.id 内のフィールドにはインデックスを付ける必要があります
小さなテーブルが大きなテーブルを駆動する 結果セットの小さい方のテーブルを左側に配置する
SELECT * を除外 必要なフィールドのみを検索
WHERE 条件によるフィルタリング JOIN に関わる行数を減らす

❓ よくある質問

Q INNER JOIN と JOIN には違いがありますか?
A いいえ。JOININNER JOIN のデフォルトです。
Q LEFT JOIN と RIGHT JOIN は同じように使えますか?
A はい。A LEFT JOIN BB RIGHT JOIN A と同等です。LEFT JOIN を一貫して使用することをお勧めします。
Q JOIN操作は処理に時間がかかりますか?
A データ量やインデックスの有無によって異なります。結合フィールドにインデックスが設定されていれば、数百万行あるテーブルに対するJOIN操作でも、数秒で結果が返されます。
Q 結合できるテーブルの数はいくつまでですか?
A 理論上、MySQLには制限はありませんが、実際には5~6テーブルを超えないようにすることをお勧めします。テーブル数が多すぎる場合は、設計の正規化を解除することを検討してください。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度:⭐):INNER JOIN を使用して、注文とその対応する顧客名を取得してください。

  2. 上級問題(難易度:⭐⭐):LEFT JOIN を使用して、これまで一度も注文をしたことがない顧客を特定してください。

  3. チャレンジ問題(難易度:⭐⭐⭐):セルフジョインを使用して従業員とその上司に関するデータを照会し、各上司が管理する部下の数を数えてください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%