MySQLにおける絞り込み条件はJOIN句かWHERE句か?
- MySQL
-
2025-12-17
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を書く機会が多い方ほど、一度立ち止まって整理しておくと役立つテーマです。




