JOIN
SQL
テーブルの結合
JOIN の種類
INNER、LEFT、RIGHT、FULL OUTER JOIN
-- サンプルテーブル
-- 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 パターン
複数テーブル結合、自己結合、サブクエリ
-- 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
);