MySQLのジョイン完全ガイド
JOINはリレーショナルデータベースの中核となる機能であり、複数のテーブルを結合して初めて、その真価が発揮される。
このレッスンでは、すべてのJOINの種類とその実用的な活用法について、体系的に解説します。
1. 学習内容
- INNER JOIN(内部結合)
- LEFT JOIN / RIGHT JOIN 外結合
- クロス結合
- 自己リンク
- USING 構文
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 タイプの概要
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 いいえ。
JOIN は INNER JOIN のデフォルトです。Q LEFT JOIN と RIGHT JOIN は同じように使えますか?
A はい。
A LEFT JOIN B は B RIGHT JOIN A と同等です。LEFT JOIN を一貫して使用することをお勧めします。Q JOIN操作は処理に時間がかかりますか?
A データ量やインデックスの有無によって異なります。結合フィールドにインデックスが設定されていれば、数百万行あるテーブルに対するJOIN操作でも、数秒で結果が返されます。
Q 結合できるテーブルの数はいくつまでですか?
A 理論上、MySQLには制限はありませんが、実際には5~6テーブルを超えないようにすることをお勧めします。テーブル数が多すぎる場合は、設計の正規化を解除することを検討してください。
📖 まとめ
- INNER JOIN は、2つのテーブルから一致する行を返します
- LEFT JOIN は、左側のテーブルのすべての行に加え、右側のテーブルから一致する行を返します(一般的に使用されます)
- RIGHT JOIN は、右側のテーブルのすべての行に加え、左側のテーブルから一致する行を返します
- CROSS JOIN はデカルト積を返す
- 自己結合:あるテーブルをそれ自体と結合すること
- USING を使用すると、同じ名前のフィールドを含む結合が簡略化されます
- インデックス設定は、結合フィールドにおける重要な最適化手法です
📝 練習問題
-
基本問題(難易度:⭐):INNER JOIN を使用して、注文とその対応する顧客名を取得してください。
-
上級問題(難易度:⭐⭐):LEFT JOIN を使用して、これまで一度も注文をしたことがない顧客を特定してください。
-
チャレンジ問題(難易度:⭐⭐⭐):セルフジョインを使用して従業員とその上司に関するデータを照会し、各上司が管理する部下の数を数えてください。



