【SQL初心者向け】JOIN句とWHERE句の順番|正しい書き方と間違いやすいポイントを詳しく解説

データベース・SQL

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」の順番で覚えましょう。

覚え方:

  1. SELECT: 「何を」取得するか決める
  2. FROM: 「どのテーブルから」取得するか決める
  3. JOIN: 「他のテーブルと組み合わせる」
  4. 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';                -- 絞り込み条件

説明

  1. customersテーブルをメインにする
  2. ordersテーブルと顧客IDで結合
  3. ステータスが’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, salary
  • departments(部署): 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;

説明

  1. 社員テーブルと部署テーブルを部署IDで結合
  2. 給与が50万円以上の社員だけを抽出
  3. 給与の高い順に並べる

例2: 注文履歴がある顧客を表示

テーブル構成

  • customers(顧客): id, name, email, status
  • orders(注文): 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;

説明

  1. 顧客テーブルと注文テーブルを顧客IDで結合
  2. アクティブな顧客で、2024年以降に注文がある人だけを抽出
  3. 重複を除いて顧客名順に表示

まとめ

覚えておきたい基本ルール

項目ルール
順番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句で結果が大きく変わる
  • 「すべて表示したいか」「条件に合うものだけか」を考えて使い分ける

間違いやすいポイント

  1. 順番を間違える: JOIN → WHERE の順番を守る
  2. 結合条件の場所: 結合条件はON句に書く
  3. LEFT JOINの条件: WHERE句に書くと意味が変わることがある

コメント

タイトルとURLをコピーしました