ホームページ >データベース >mysql チュートリアル >SQL JOIN の WHERE と ON: 各句をいつ使用する必要がありますか?
JOIN における WHERE 句と ON 条件の違いを調べる
SQL 実践者は、JOIN 操作を実行するときに、WHERE 句と ON 条件を同じ意味で使用することがよくあります。 。どちらのアプローチでも同じ結果が返されますが、考慮すべきニュアンスがあります。
この例では、
SELECT * FROM Foo AS f INNER JOIN Bar AS b ON b.BarId = f.BarId WHERE b.IsApproved = 1;
と
SELECT * FROM Foo AS f INNER JOIN Bar AS b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);どちらのクエリも同じ行のセットを返しますが、実行には決定的な違いがあります。フィルターを WHERE 句に配置すると、JOIN 操作の後に適用されます。これは、JOIN により、b.IsApproved が false の行も含めて、両方のテーブルから一致するすべての行が取得されることを意味します。次に、WHERE 句は、基準 b.IsApproved = 1 を満たさない行をフィルターで除外します。対照的に、フィルターが ON 条件に配置されている場合、条件は JOIN の前に評価されます。その結果、b.BarId と b.IsApproved の両方が指定された基準を満たす行のみが JOIN に含まれます。
外部結合とフィルター配置
ただしこの違いは、外部結合を扱う場合に特に重要になります。次の左外部結合クエリを考えてみましょう:SELECT * FROM Foo AS f LEFT OUTER JOIN Bar AS b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);この場合、ON 条件のフィルターは、b.IsApproved が false である行、または指定された f に一致する b.BarId が存在しない行を除外します。 .BarId。この動作は、WHERE 句にフィルターを配置する場合とは異なります。
SELECT * FROM Foo AS f LEFT OUTER JOIN Bar AS b ON (b.BarId = f.BarId) WHERE b.IsApproved = 1;2 番目のクエリでは、b.IsApproved が false である行、または失敗した結合に関係する行は引き続き返されますが、b.IsApproved はしたがって、外部結合を使用する場合は、フィルターの配置を慎重に検討することが重要です。 ON 条件は結合の前に行をフィルターし、WHERE 句は結合後の結果をフィルターします。説明の最後に、左外部結合でオプションのフィルターが必要な場合、次のクエリは正しい配置を示します。 :
SELECT * FROM Foo AS f LEFT OUTER JOIN Bar AS b ON (b.BarId = f.BarId) WHERE b.IsApproved IS NULL OR b.IsApproved = 1;このクエリは、結合が成功し、b.IsApproved が基準を満たしている行と、結合が成功した行を返します。失敗します (b.IsApproved に NULL 値が返されます)。
以上がSQL JOIN の WHERE と ON: 各句をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。