レッスン 3
JOIN とクエリの形
JOIN を意図的に使い、クエリの形が結果行に与える影響を理解します。
JOIN は複数テーブルの行を結合します。アプリケーションコードでは、あるエンティティが別のエンティティを参照するときに JOIN が現れます。注文はユーザーに属し、コメントは投稿に属し、請求書はアカウントに属します。
SELECT users.email, orders.total
FROM users
JOIN orders ON orders.user_id = users.id
WHERE orders.status = 'paid';
重要なのは ON 条件です。行の関連方法をデータベースに伝えます。条件が間違っているか欠けていると、結果が予想よりはるかに多くの行に膨らむことがあります。
INNER JOIN と LEFT JOIN
JOIN は通常 inner join を意味します。両側で一致する行を残します。
LEFT JOIN は右側に一致がなくても、左側のすべての行を残します。
SELECT users.email, orders.id
FROM users
LEFT JOIN orders ON orders.user_id = users.id;
「注文がなくてもユーザーを表示する」場合に有用ですが、右側に NULL 値が入ることもあります。
重複は多くの場合クエリの形の問題
1 ユーザーに 5 件の注文があると、users と orders を JOIN するとそのユーザーに 5 行返ります。これはデータベースのバグではありません。リレーションシップの形です。
重複のように見える行が現れたら、次を問いかけてください。
- これは 1 対多のリレーションシップか?
- 代わりに行を集約すべきか?
- JOIN 条件に複合キーの一部が欠けていないか?
- 右側フィルタが
WHEREに移動してLEFT JOINが inner join になっていないか?
要点
JOIN を行の乗算ルールとして読みます。フォーマッタは JOIN ブロックを見えるようにできますが、カーディナリティ(1 対 1、1 対多、オプショナルな関係)については依然として推論が必要です。
SQL Formatter で各 JOIN と ON 条件を見えるようにしてから、クエリ結果をレビューしてください。