カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

MySQLにおける絞り込み条件はJOIN句かWHERE句か?

MySQLで複数テーブルを結合する際、絞り込み条件をJOIN句(ON句)に書くべきか、WHERE句に書くべきかで迷った経験はないでしょうか。

本記事では、INNER JOIN と OUTER JOIN(LEFT JOIN)それぞれの場合について、意味の違い・結果の違い・設計上の考え方を整理し、実務で迷わないための指針をまとめます。

前提となるサンプル構造

以下のようなテーブルを例に説明します。

users
- id
- name

orders
- id
- user_id
- status

「ユーザーと注文を結合し、特定の条件で絞り込む」という典型的なケースです。

INNER JOIN の場合

JOIN句に条件を書く場合
SELECT *
FROM users u
INNER JOIN orders o
  ON u.id = o.user_id
 AND o.status = 'paid';
WHERE句に条件を書く場合
SELECT *
FROM users u
INNER JOIN orders o
  ON u.id = o.user_id
WHERE o.status = 'paid';
結果は同じ?

はい、INNER JOINの場合は結果は同じになります。

INNER JOINは「結合条件を満たさない行を捨てる」ため、ON句に書いてもWHERE句に書いても、論理的な結果は一致します。

では、どちらが良いのか?
  • 結合条件 → ON句
  • 検索・絞り込み条件 → WHERE句

という役割分担を意識すると、SQLの可読性が向上します。

LEFT JOIN(OUTER JOIN)の場合

ここが最も重要なポイントです。

JOIN句に条件を書く場合(推奨されることが多い)
SELECT *
FROM users u
LEFT JOIN orders o
  ON u.id = o.user_id
 AND o.status = 'paid';
結果の意味
  • すべてのusersは必ず取得される
  • 条件を満たすordersがあれば結合される
  • なければorders側はNULL

「支払い済み注文があれば表示する」という意味になる

WHERE句に条件を書く場合(注意)
SELECT *
FROM users u
LEFT JOIN orders o
  ON u.id = o.user_id
WHERE o.status = 'paid';
何が起きるか?

LEFT JOINで結合されたはずの、

  • 注文が存在しないユーザー
  • 条件に合わない注文しかないユーザー

は、WHERE句の条件で除外されます

結果として、

INNER JOINと同じ結果になります

これはバグの温床になりやすいポイントです。

図でイメージすると

  • ON句の条件:
    • 「どう結合するか」を定義
  • WHERE句の条件:
    • 「最終結果から何を除外するか」を定義

LEFT JOIN + WHERE句の組み合わせは、

LEFT JOINしたあとに行を削除する

という挙動になることを理解しておく必要があります。

パフォーマンスへの影響は?

MySQLのオプティマイザは賢いため、

  • INNER JOIN
  • 適切なインデックス

が存在する場合、ON句かWHERE句かで大きな性能差が出ることは稀です。

ただし、

  • 可読性
  • 意図の明確さ
  • 将来的なSQL修正時の安全性

という観点では、意味に合った場所に書くことが重要です。

実務での指針まとめ

INNER JOIN
条件の種類 書く場所
結合キー ON句
絞り込み WHERE句

※結果は同じだが、役割分担を意識

LEFT JOIN
目的 書く場所
結合の条件 ON句
主テーブルの絞り込み WHERE句
副テーブルの条件 原則ON句

よくあるアンチパターン

LEFT JOIN tableB b ON a.id = b.a_id
WHERE b.some_column = 1;
  • LEFT JOINの意味が失われる
  • 意図せずINNER JOINになる
  • 後から読んだ人が混乱する

LEFT JOINを使う理由を明確に

まとめ

  • INNER JOINでは結果は同じだが、意味で書き分ける
  • LEFT JOINではON句とWHERE句の違いが結果を左右する
  • 「結合」と「絞り込み」を頭の中で分離して考える

この考え方を身につけると、

  • バグの少ないSQL
  • 読みやすいSQL
  • 将来修正しやすいSQL

を書くことができます。

実務でSQLを書く機会が多い方ほど、一度立ち止まって整理しておくと役立つテーマです。

この記事がお役に立ちましたらシェアお願いします
82 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です