ホームページ > データベース > mysql チュートリアル > SQL JOIN の WHERE と ON: 各句をいつ使用する必要がありますか?

SQL JOIN の WHERE と ON: 各句をいつ使用する必要がありますか?

DDD
リリース: 2025-01-05 13:10:44
オリジナル
293 人が閲覧しました

WHERE vs. ON in SQL JOINs: When Should I Use Each Clause?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート