SQL

JOIN

SQL

テーブルの結合

JOIN の種類

INNER、LEFT、RIGHT、FULL OUTER JOIN

joins.sql sql
-- サンプルテーブル
-- users:  id, name
-- orders: id, user_id, total

-- INNER JOIN: 両方に存在する行のみ
SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- LEFT JOIN: usersの全行 + マッチするordersがなければNULL
SELECT u.name, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 注文のないユーザーも含まれる(o.total は NULL)

-- RIGHT JOIN: ordersの全行 + マッチするusersがなければNULL
SELECT u.name, o.total
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- FULL OUTER JOIN: 両方の全行
SELECT u.name, o.total
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;

-- CROSS JOIN: 全組み合わせ(直積)
SELECT * FROM colors CROSS JOIN sizes;

JOIN パターン

複数テーブル結合、自己結合、サブクエリ

join-patterns.sql sql
-- 3テーブルの結合
SELECT
    u.name,
    o.order_date,
    p.name  AS product_name,
    oi.qty  AS quantity
FROM users u
JOIN orders o      ON u.id       = o.user_id
JOIN order_items oi ON o.id      = oi.order_id
JOIN products p    ON oi.product_id = p.id;

-- 自己結合(従業員とその上司)
SELECT
    e.name  AS employee,
    m.name  AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

-- 注文のないユーザーのみ取得(アンチジョイン)
SELECT u.*
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;

-- EXISTS を使う方法(大量データで高速)
SELECT * FROM users u
WHERE EXISTS (
    SELECT 1 FROM orders WHERE user_id = u.id
);