ホームページ >データベース >mysql チュートリアル >JOIN 句の WHERE と ON: フィルターの配置が重要になるのはどのような場合ですか?
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 サイトの他の関連記事を参照してください。