ホームページ >データベース >mysql チュートリアル >JOIN 句の WHERE と ON: フィルターの配置が重要になるのはどのような場合ですか?

JOIN 句の WHERE と ON: フィルターの配置が重要になるのはどのような場合ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-05 08:12:40994ブラウズ

WHERE vs. ON in JOIN Clauses: When Does Filter Placement Matter?

JOIN クエリの WHERE 句と ON 句の違いを理解する

2 つのテーブル Foo と Bar を結合するときは、次のシナリオを考慮してください。 BarId 列:

INNER WHERE 句による JOIN

SELECT * 
FROM Foo f
INNER JOIN Bar b ON b.BarId = f.BarId
WHERE b.IsApproved = 1;

ON 句による INNER JOIN

SELECT * 
FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);

これら 2 つのクエリは同じ結果を返します。ただし、外部結合を扱う場合、重大な違いが現れます。 LEFT OUTER JOIN を使用して見てみましょう:

ON 句フィルターを使用した LEFT OUTER JOIN

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId); 

WHERE 句フィルターを使用した LEFT OUTER JOIN

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1); 

で最初のクエリでは、右側のテーブル (バー) の行が、結合プロセス中に IsApproved 列に基づいてフィルターされます。逆に、2 番目のクエリでは、このフィルタリングは結合のに実行されます。

この区別は、b.BarId に null 値がある場合に重要になります。最初のクエリでは、そのような行は引き続き結果に含まれます (Bar の列には null 値が含まれます)。 2 番目のクエリでは、これらの行は WHERE 句によってフィルタリングされます。

OPTIONAL フィルタと同等

OPTIONAL フィルタの場合 (例: b.IsApproved は使用されません)制限付き)、WHERE 句を使用した同等の LEFT OUTER JOIN は次のようになります。 be:

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);

これは、結合が失敗した場合 (b.BarId が null でフィルターは無視される必要がある) と、結合が成功してフィルターが適用される必要がある場合の両方を考慮します。

結論

一見すると、WHERE 句または ON 句にフィルターを配置するように見えますが、重要なことではありませんが、動作の微妙な違い (特に外部結合の場合) については、慎重な検討が必要です。この区別により、正確なデータ取得と効率的なクエリ最適化が保証されます。

以上がJOIN 句の WHERE と ON: フィルターの配置が重要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。