SQL JOIN と WHERE による結合の違いと使い方を完全解説

SQLのテーブル結合において、JOIN句とWHERE句の使い分けに悩んでいませんか?それぞれの特徴や使い方の違い、パフォーマンスへの影響まで詳しく解説します。

SQL JOIN と WHERE によるテーブル結合の基礎知識

テーブル結合の基本
📊
結合の目的

複数のテーブルから必要なデータを取得して一つの結果セットにまとめる

🔄
結合の方法

JOIN句による明示的な結合とWHERE句による暗黙的な結合

実行効率

クエリオプティマイザによる最適化と実行計画の重要性

SQL JOIN句による明示的なテーブル結合の基本構文

JOINを使用したテーブル結合の基本的な書き方を見ていきましょう。以下は最も一般的な内部結合(INNER JOIN)の例です。


SELECT 
    orders.order_id,
    customers.customer_name,
    products.product_name
FROM orders
INNER JOIN customers 
    ON orders.customer_id = customers.customer_id
INNER JOIN products
    ON orders.product_id = products.product_id

 

この構文では、結合条件がON句で明示的に指定されるため、テーブル間の関係性が分かりやすいという特徴があります。

WHERE句を使用した従来型のテーブル結合手法

WHERE句による結合は、以下のような構文で記述します:


SELECT 
    orders.order_id,
    customers.customer_name,
    products.product_name
FROM orders, customers, products
WHERE orders.customer_id = customers.customer_id
    AND orders.product_id = products.product_id

 

この方法は古典的なSQL構文として知られていますが、複数のテーブルを結合する際に条件が複雑になりやすいという欠点があります。

SQL JOINとWHEREの実行順序とパフォーマンスの関係

テーブル結合の実行順序は以下のようになっています:

  1. FROM句とJOIN句の処理
  2. WHERE句による絞り込み
  3. GROUP BY句の処理
  4. HAVING句の処理
  5. SELECT句の処理
  6. ORDER BY句の処理

 

ただし、実際の処理はデータベースのオプティマイザによって最適化されます。例えば、以下のようなクエリは:


SELECT * 
FROM orders 
INNER JOIN customers 
    ON orders.customer_id = customers.customer_id 
WHERE customers.age > 50

 

オプティマイザによって以下のように最適化される可能性があります:


SELECT * 
FROM orders 
INNER JOIN (
    SELECT * FROM customers WHERE age > 50
) AS filtered_customers 
    ON orders.customer_id = filtered_customers.customer_id

外部結合におけるJOINとWHEREの重要な違い

外部結合(OUTER JOIN)を使用する場合、JOINとWHEREの違いは特に重要になります。


-- LEFT JOINの場合
SELECT * 
FROM orders 
LEFT JOIN customers 
    ON orders.customer_id = customers.customer_id 
    AND customers.country = 'Japan'
-- 上記とは異なる結果になる
SELECT * 
FROM orders 
LEFT JOIN customers 
    ON orders.customer_id = customers.customer_id 
WHERE customers.country = 'Japan'

 

1つ目のクエリでは、条件に一致しない場合でもordersテーブルの行が保持されますが、2つ目のクエリではWHERE句の条件によってフィルタリングされてしまいます。

SQL結合のベストプラクティスとパフォーマンスチューニング

効率的なテーブル結合のためのベストプラクティスをまとめます:

  1. インデックスの活用

    • 結合キーとなるカラムにはインデックスを作成
    • 複合インデックスの検討

  2. 結合条件の最適化

    • 不要なテーブル結合を避ける
    • 結合前のデータ量を削減

  3. クエリの可読性向上

    • テーブルエイリアスの適切な使用
    • 結合条件の明確な記述


-- 良い例
SELECT 
    o.order_id,
    c.customer_name,
    p.product_name
FROM orders o
INNER JOIN customers c 
    ON o.customer_id = c.customer_id
INNER JOIN products p
    ON o.product_id = p.product_id
WHERE o.order_date >= '2024-01-01'
-- 避けるべき例
SELECT *
FROM orders, customers, products
WHERE orders.customer_id = customers.customer_id
    AND orders.product_id = products.product_id
    AND orders.order_date >= '2024-01-01'

 

実行計画を確認することで、クエリのパフォーマンスを評価し、必要に応じて最適化することができます。