レッスン 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 件の注文があると、usersorders を JOIN するとそのユーザーに 5 行返ります。これはデータベースのバグではありません。リレーションシップの形です。

重複のように見える行が現れたら、次を問いかけてください。

  • これは 1 対多のリレーションシップか?
  • 代わりに行を集約すべきか?
  • JOIN 条件に複合キーの一部が欠けていないか?
  • 右側フィルタが WHERE に移動して LEFT JOIN が inner join になっていないか?

要点

JOIN を行の乗算ルールとして読みます。フォーマッタは JOIN ブロックを見えるようにできますが、カーディナリティ(1 対 1、1 対多、オプショナルな関係)については依然として推論が必要です。

SQL Formatter で各 JOINON 条件を見えるようにしてから、クエリ結果をレビューしてください。

実践したいときは関連する DevCove ツールを使えます。任意であり、このレッスンの必須部分ではありません。

関連ツールを開く

コース概要へ戻る