SQLを学んでいると、
「JOIN句とWHERE句はどちらを先に書くの?」
「条件はONとWHEREのどちらに書けばいいの?」
という疑問が出てきますよね。
実は、SQLには決められた順番があり、この順番を間違えるとエラーになったり、意図しない結果になったりします。
この記事では、JOIN句とWHERE句の正しい順番と使い方を、具体例とともにわかりやすく解説します。
SQLの基本的な順番を覚えよう

SQL文の構造
SQLには、必ず守らなければいけない順番があります。
まずはこの基本構造を覚えましょう。
SELECT -- 取得したい列を指定
FROM -- メインのテーブルを指定
JOIN -- 他のテーブルと結合
ON -- 結合の条件を指定
WHERE -- データを絞り込む条件
GROUP BY -- グループ化
HAVING -- グループ化後の条件
ORDER BY -- 並び順を指定
覚え方のコツ
「SELECT → FROM → JOIN → WHERE」の順番で覚えましょう。
覚え方:
- SELECT: 「何を」取得するか決める
- FROM: 「どのテーブルから」取得するか決める
- JOIN: 「他のテーブルと組み合わせる」
- WHERE: 「条件を絞り込む」
この順番は変更できません。順番を間違えるとエラーになります。
JOIN句とWHERE句の役割の違い
JOIN句の役割:テーブルを組み合わせる
JOIN句は、複数のテーブルを1つにまとめるための機能です。
例:顧客情報と注文情報を組み合わせる
- 顧客テーブル:名前、住所、電話番号
- 注文テーブル:商品名、数量、金額、顧客ID
この2つを顧客IDで結びつけて、「どの顧客がどんな注文をしたか」がわかる1つのテーブルを作ります。
WHERE句の役割:データを絞り込む
WHERE句は、結合されたデータの中から必要なものだけを選ぶための機能です。
例:結合したデータから「東京在住の顧客」だけを抽出
- 結合後のデータから条件に合うデータだけを表示
処理の流れ
1. FROM句でメインテーブルを決める
↓
2. JOIN句で他のテーブルと結合
↓
3. WHERE句で条件に合うデータだけを選ぶ
↓
4. SELECT句で必要な列だけを表示
基本的な書き方の例

正しい書き方
例:顧客と注文の情報を結合して、アクティブな顧客だけを表示
SELECT
customers.name, -- 顧客名
orders.product_name -- 商品名
FROM customers -- 顧客テーブル
JOIN orders ON customers.id = orders.customer_id -- 結合条件
WHERE customers.status = 'active'; -- 絞り込み条件
説明:
customers
テーブルをメインにするorders
テーブルと顧客IDで結合- ステータスが’active’の顧客だけを表示
間違った書き方
-- ❌ 間違い:WHERE句がJOIN句より前に来ている
SELECT customers.name, orders.product_name
FROM customers
WHERE customers.status = 'active'
JOIN orders ON customers.id = orders.customer_id;
何が間違い?: WHERE句がJOIN句より前に書かれているため、エラーになります。
ONとWHEREの使い分け
ON句:結合の条件を書く
ON句は、「どの条件でテーブルを結合するか」を指定します。
-- 顧客IDが一致するレコード同士を結合
JOIN orders ON customers.id = orders.customer_id
WHERE句:結果の絞り込み条件を書く
WHERE句は、「結合した結果の中から、どのデータを表示するか」を指定します。
-- 結合した結果から、ステータスがactiveのものだけを表示
WHERE customers.status = 'active'
実例で比較
例1: ON句に条件を書いた場合
SELECT customers.name, orders.product_name
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
AND orders.status = 'completed' -- ON句に条件
結果: すべての顧客が表示される。注文がない顧客や、完了していない注文の顧客は、注文情報がNULLで表示される。
例2: WHERE句に条件を書いた場合
SELECT customers.name, orders.product_name
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
WHERE orders.status = 'completed' -- WHERE句に条件
結果: 完了した注文がある顧客だけが表示される。注文がない顧客は表示されない。
JOINの種類による注意点

INNER JOINの場合
INNER JOINでは、ONとWHEREのどちらに条件を書いても結果はほぼ同じになります。
-- この2つは同じ結果になる
-- パターン1: ON句に条件
SELECT *
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id
AND orders.amount > 1000;
-- パターン2: WHERE句に条件
SELECT *
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id
WHERE orders.amount > 1000;
LEFT JOINの場合(注意が必要)
LEFT JOINでは、条件をONとWHEREのどちらに書くかで結果が大きく変わります。
LEFT JOIN + ON句:
SELECT customers.name, orders.product_name
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
AND orders.status = 'completed'
結果: すべての顧客が表示される(注文がない顧客も含む)
LEFT JOIN + WHERE句:
SELECT customers.name, orders.product_name
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
WHERE orders.status = 'completed'
結果: 完了した注文がある顧客だけが表示される
よくある間違いと解決法

間違い1: 順番が逆
-- ❌ 間違い
SELECT *
FROM customers
WHERE status = 'active'
JOIN orders ON customers.id = orders.customer_id;
解決法: JOIN句をWHERE句より前に書く
-- ✅ 正しい
SELECT *
FROM customers
JOIN orders ON customers.id = orders.customer_id
WHERE status = 'active';
間違い2: 結合条件をWHERE句に書く
-- ❌ 間違い(古い書き方)
SELECT *
FROM customers, orders
WHERE customers.id = orders.customer_id
AND customers.status = 'active';
解決法: 結合条件はON句に書く
-- ✅ 正しい(現代的な書き方)
SELECT *
FROM customers
JOIN orders ON customers.id = orders.customer_id
WHERE customers.status = 'active';
間違い3: LEFT JOINでWHERE句を間違って使う
-- ❌ 意図しない結果になる可能性
SELECT customers.name, orders.product_name
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
WHERE orders.product_name IS NOT NULL; -- 注文がある顧客のみ
解決法: LEFT JOINの意味を考えて条件を配置
-- ✅ すべての顧客を表示したい場合
SELECT customers.name, orders.product_name
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
AND orders.product_name IS NOT NULL;
実用的な例で練習
例1: 会社の社員と部署の情報
テーブル構成:
employees
(社員): id, name, department_id, salarydepartments
(部署): id, department_name
SQL:
SELECT
employees.name,
departments.department_name,
employees.salary
FROM employees
JOIN departments ON employees.department_id = departments.id
WHERE employees.salary > 500000
ORDER BY employees.salary DESC;
説明:
- 社員テーブルと部署テーブルを部署IDで結合
- 給与が50万円以上の社員だけを抽出
- 給与の高い順に並べる
例2: 注文履歴がある顧客を表示
テーブル構成:
customers
(顧客): id, name, email, statusorders
(注文): id, customer_id, order_date, amount
SQL:
SELECT DISTINCT
customers.name,
customers.email
FROM customers
JOIN orders ON customers.id = orders.customer_id
WHERE customers.status = 'active'
AND orders.order_date >= '2024-01-01'
ORDER BY customers.name;
説明:
- 顧客テーブルと注文テーブルを顧客IDで結合
- アクティブな顧客で、2024年以降に注文がある人だけを抽出
- 重複を除いて顧客名順に表示
まとめ

覚えておきたい基本ルール
項目 | ルール | 例 |
---|---|---|
順番 | SELECT → FROM → JOIN → WHERE | 順番は変更不可 |
ON句の役割 | テーブルの結合条件 | ON customers.id = orders.customer_id |
WHERE句の役割 | 結合後のデータ絞り込み | WHERE customers.status = 'active' |
JOIN種類別の注意点
INNER JOIN:
- ONとWHEREのどちらに条件を書いても結果は同じ
- 読みやすさを考えてWHERE句に書くのがおすすめ
LEFT JOIN:
- ON句とWHERE句で結果が大きく変わる
- 「すべて表示したいか」「条件に合うものだけか」を考えて使い分ける
間違いやすいポイント
- 順番を間違える: JOIN → WHERE の順番を守る
- 結合条件の場所: 結合条件はON句に書く
- LEFT JOINの条件: WHERE句に書くと意味が変わることがある
コメント