節に anAND
を追加しました。ON
このON
句はブール値の true または false に評価されるだけなのでAND
、たとえばOR
ブール演算子が許可され、括弧などに関するすべての通常の規則も適用されます。
特定の結合テーブルに固有の条件を句からWHERE
適切なON
句に移動すると、多くの場合、有利になります (読みやすさを向上させる以外の理由がない場合)。
大きな結果セットを返し、最後に句でこれをフィルタリングするのではなく、他のテーブルに結合する前に結合の結果を制限することは論理的に*意味があります。WHERE
*logical と言うのは、多くの場合、DBMS がクエリを最適化して、とにかくこれが発生するようにするためです...ただし、常にではありません...パフォーマンスの低いクエリは、結合でフィルタリングすることで改善できる場合があります (逆の場合もあります)。
たとえば、25 歳以上の人にのみ関心があることがわかっている場合は、若いパンクスのみに関連する後続のテーブルのすべてJOIN persons ON persons.id = team_memberships.participant AND persons.age > 25
の結果を含めて、最後にこれらの結果のみを再度フィルター処理するのではなく、あなたの条項で。WHERE persons.age > 25
私の理解では、追加の式ON
が次の場合に、節に追加の式が追加された結果、結合のパフォーマンスが低下する可能性があります。
したがって、たとえば、特定の結合が遅くなったとしても、結合時に結果セットから若いパンクを削除する価値があると証明される場合があります。その時点での結果セットが小さいと、後続の結合のパフォーマンスが大幅に向上する可能性があるためです。ただし、結合でそれらを含めてもレコード数がわずかに増加するだけの場合は、結合でそれらを含めてからWHERE
句で除外する方が実際には速い場合があります。
しかし、私の理解を明確化/修正するコメントを歓迎します。
編集:以下の @ITroubs コメントに従って、結合が anINNER JOIN
の場合、追加のフィルター条件がON
orWHERE
句にあるかどうかに関係なく、最終的な結果セットは同じになることを明確にする必要がありましたが、たとえば OP の元の例でLEFT JOIN ON team_memberships
は、フィルタ条件を から に移動すると、まったく異なる結果セットが生成WHERE
されLEFT JOIN ... ON ...
ます。