SQL構文について考えるときは、SQL操作の論理的な順序を理解することが重要です。句JOIN
の演算子です(そしてON
関連するに属しますJOIN
) 。FROM
この句は、論理的FROM
に実行される最初の操作です(オプティマイザーは引き続き物事を並べ替えることを選択できます)。
あなたの例では、実際には違いはありませんが、との違いについてこのブログ投稿で示したように、簡単に構築できます(ブログON
WHERE
OUTER JOIN
投稿の例ではSakilaデータベースを使用しています)。
最初のクエリ
SELECT a.actor_id, a.first_name, a.last_name, count(fa.film_id)
FROM actor a
LEFT JOIN film_actor fa ON a.actor_id = fa.actor_id
WHERE fa.film_id < 10
GROUP BY a.actor_id, a.first_name, a.last_name
ORDER BY count(fa.film_id) ASC;
収量:
ACTOR_ID FIRST_NAME LAST_NAME COUNT
--------------------------------------
194 MERYL ALLEN 1
198 MARY KEITEL 1
30 SANDRA PECK 1
85 MINNIE ZELLWEGER 1
123 JULIANNE DENCH 1
WHERE
句で外部結合テーブルをフィルタリングしたため、LEFT JOIN
は事実上。に変換されましたINNER JOIN
。なんで?映画に出演していない俳優がいた場合、その俳優の唯一の行にはが含まfa.film_id IS NULL
れ、fa.film_id < 10
述語はになりNULL
ます。このようなアクターは、と同様に結果から除外されINNER JOIN
ます。
2番目のクエリ
SELECT a.actor_id, a.first_name, a.last_name, count(fa.film_id)
FROM actor a
LEFT JOIN film_actor fa ON a.actor_id = fa.actor_id
AND fa.film_id < 10
GROUP BY a.actor_id, a.first_name, a.last_name
ORDER BY count(fa.film_id) ASC;
収量:
ACTOR_ID FIRST_NAME LAST_NAME COUNT
-----------------------------------------
3 ED CHASE 0
4 JENNIFER DAVIS 0
5 JOHNNY LOLLOBRIGIDA 0
6 BETTE NICHOLSON 0
...
1 PENELOPE GUINESS 1
200 THORA TEMPLE 1
2 NICK WAHLBERG 1
198 MARY KEITEL 1
これで、述語がの述語のfa.film_id < 10
一部であるため、映画のない俳優が結果に含まれます。LEFT JOIN
ON
結論
常に論理的に最も意味のある場所に述語を配置します。
- それらはあなたの
JOIN
操作の一部ですか?それらをに配置しますON
- それらはあなたの
JOIN
製品全体にフィルターをかけていますか?それらをに配置しますWHERE