Computer365120 views
中学英語808712 views
雑学1472593 views
小学理科717236 views
高校倫理1433119 views
りんご192546 views
LaTeX957300 views
いろは2986023 views
中学数学621382 views
世界の国560595 views
Help
Tools

English

複数のテーブルを JOIN で結合する

3 つ以上のテーブルを結合したいときも、JOIN を連続して使えます。実務では、複数のテーブルにまたがるデータを取得することがよくあります。

基本的な考え方

JOIN を複数回書いて、テーブルを順番につなげていきます。

SELECT ...
FROM テーブル1
JOIN テーブル2 ON 条件1
JOIN テーブル3 ON 条件2
JOIN テーブル4 ON 条件3;

具体例

usersordersproducts の 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 は強力ですが、クエリが複雑になりがちです。読みやすさを保つために、適切なインデントと別名をつける習慣をつけておきましょう。