次の2つの例があります。
1.例(WHERE)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
WHERE t2.field = true
2.例(JOIN AND)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id AND t2.field = true
パフォーマンスの面でより速い方法は何ですか?あなたは何を好むか?
フィルタがJOIN
機能的に条件に入った場合(つまり、フィルタだけでなく実際の結合条件である場合)、ON
その結合の句に含まれている必要があります。
注目に値する:
代わりにWHERE
句に配置すると、結合がの場合はパフォーマンスが同じになりINNER
、それ以外の場合はパフォーマンスが異なります。コメントで述べたように、とにかく結果が異なるので、それは実際には重要ではありません。
WHERE
本当に条件であるときに句にフィルターを配置すると、OUTER JOIN
条件の性質が暗黙的にキャンセルOUTER
されます(「レコードがない場合でも参加する」)。これらのフィルターは、そもそも既存のレコードが存在する必要があることを意味します。例:
... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5
正しい
... table1 t LEFT JOIN table2 u ON ...
WHERE t2.column = 5
t2からのレコードが予期されていることをエンジンに通知するため、これは正しくありませt2.column = 5
ん。これは外部結合に反します。これに対する例外は、次IS NULL
のようなフィルターWHERE t2.column IS (NOT) NULL
です(これは、実際には条件付き外部結合を構築するための便利な方法です)
LEFT
RIGHT
結合は暗黙的にOUTER
結合です。お役に立てば幸いです。
JOIN
通常、条件はフィルター条件から独立している必要があります。結合のルール(how)を。で定義しますON
。必要なものをでフィルタリングしますWHERE
。パフォーマンスに関しては、すべてのエンジンとデザインに共通のルールはないため、走行距離は大きく異なります。
より高速な方法は、フィルターをwhere句に配置することです。これは、フィルターをwhereで最初に、次に結合句で処理するため、フィルターを並べ替える必要がないためです。