複数のテーブルを JOIN で結合する
3 つ以上のテーブルを結合したいときも、JOIN を連続して使えます。実務では、複数のテーブルにまたがるデータを取得することがよくあります。
基本的な考え方
JOIN を複数回書いて、テーブルを順番につなげていきます。
SELECT ...
FROM テーブル1
JOIN テーブル2 ON 条件1
JOIN テーブル3 ON 条件2
JOIN テーブル4 ON 条件3;具体例
users、orders、products の 3 テーブルがあるとします。
-- users: id, name
-- orders: id, user_id, product_id
-- products: id, name, priceユーザー名、商品名、価格を一覧で取得するには、こう書きます。
SELECT u.name AS user_name, p.name AS product_name, p.price
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;users と orders を user_id で結合し、さらに orders と products を product_id で結合しています。
INNER JOIN と LEFT JOIN を混ぜる
必要に応じて INNER JOIN と LEFT JOIN を混ぜることもできます。
SELECT u.name, o.id AS order_id, p.name AS product_name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN products p ON o.product_id = p.id;この例では、注文がないユーザーも結果に含まれます。注文がなければ order_id と product_name は NULL になります。
結合の順番
JOIN の順番は結果に影響します。基本的には、主となるテーブルから始めて、関連するテーブルを順番に結合していきます。
基準となるテーブル(FROM)
直接関連するテーブル
間接的に関連するテーブル
同じテーブルを複数回結合する
同じテーブルを別の条件で複数回結合することもあります。
-- orders に buyer_id と seller_id があるとして
SELECT
buyer.name AS buyer_name,
seller.name AS seller_name,
o.product
FROM orders o
JOIN users buyer ON o.buyer_id = buyer.id
JOIN users seller ON o.seller_id = seller.id;users テーブルを 2 回使っていますが、別名(buyer、seller)をつけているので区別できます。
パフォーマンスの注意点
テーブルを多く結合すると、処理が重くなることがあります。
インデックス
JOIN の条件に使うカラムにインデックスがあると速くなります
不要なカラム
SELECT * ではなく、必要なカラムだけを指定するほうがよいです
複数テーブルの JOIN は強力ですが、クエリが複雑になりがちです。読みやすさを保つために、適切なインデントと別名をつける習慣をつけておきましょう。











