SELECT u.name, o.item
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
結果: 佐藤-りんご / 佐藤-みかん / 鈴木-ぶどう
→ 高橋(注文なし)と user_id=9(会員なし)は消える
LEFT JOIN(左の表は全行残す)
SELECT u.name, o.item
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
結果: 佐藤-りんご / 佐藤-みかん / 鈴木-ぶどう / 高橋-NULL
→ 注文のない高橋も残る(注文列はNULL)。実務で最もよく使う
RIGHT JOIN(右の表は全行残す)
SELECT u.name, o.item
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
結果: 佐藤-りんご / 佐藤-みかん / 鈴木-ぶどう / NULL-メロン
→ 会員のいない注文(メロン)も残る。LEFT JOINで表の順番を入れ替えれば同じことができる
FULL OUTER JOIN(両方の全行を残す)
SELECT u.name, o.item
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;
結果: 上の全部 + 高橋-NULL + NULL-メロン
※ MySQLには無い(LEFT JOIN と RIGHT JOIN を UNION して代用)
CROSS JOIN(全組み合わせ)
SELECT u.name, o.item FROM users u CROSS JOIN orders o;
結果: 3人 × 4注文 = 12行。ON句は書かない。組み合わせ表を作るときだけ使う
使い分けの早見表
やりたいこと
使うJOIN
注文がある会員だけ集計したい
INNER JOIN
注文ゼロの会員も含めて一覧にしたい
LEFT JOIN
どちらかにしか無いデータ(不整合)を探したい
LEFT JOIN + WHERE 右がNULL(またはFULL OUTER)
マスタ同士の全組み合わせを作りたい
CROSS JOIN
LEFT JOINのあとWHERE句で右の列の条件を書くとINNERに化けます。右の列の条件は ON 句に書くか、WHERE (o.x = 1 OR o.x IS NULL) としてください。