SQLでテーブル結合を使って一致するデータを抽出する方法について、具体的なサンプルコードと共に解説します。初心者でも理解できる内部結合から応用的な外部結合まで、実践的な使い方を学んでみませんか?
SQL JOIN と WHERE による結合の違いと使い方を完全解説
SQLのテーブル結合において、JOIN句とWHERE句の使い分けに悩んでいませんか?それぞれの特徴や使い方の違い、パフォーマンスへの影響まで詳しく解説します。
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句による結合は、以下のような構文で記述します:
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構文として知られていますが、複数のテーブルを結合する際に条件が複雑になりやすいという欠点があります。
テーブル結合の実行順序は以下のようになっています:
ただし、実際の処理はデータベースのオプティマイザによって最適化されます。例えば、以下のようなクエリは:
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
外部結合(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句の条件によってフィルタリングされてしまいます。
効率的なテーブル結合のためのベストプラクティスをまとめます:
-- 良い例
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'
実行計画を確認することで、クエリのパフォーマンスを評価し、必要に応じて最適化することができます。