Pro vnitřní spojení, jako je tento, jsou logicky ekvivalentní. Můžete se však dostat do situací, kdy podmínka v klauzuli spojení znamená něco jiného než podmínka v klauzuli where.
Pro jednoduchou ilustraci si představte, že uděláte levý spoj takto;
select x.id
from x
left join y
on x.id = y.id
;
Zde bereme všechny řádky z x, bez ohledu na to, zda existuje odpovídající id v y. Nyní řekněme, že naše podmínka pro připojení roste – nehledáme pouze shody v y na základě id, ale také podle id_type.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Opět to dává všechny řádky v x bez ohledu na to, zda existuje shoda (id, id_type) v y.
Toto je však velmi odlišné:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
V této situaci vybíráme všechny řádky x a snažíme se přiřadit řádky od y. Nyní pro řádky, pro které neexistuje shoda v y, bude y.id_type null. Z tohoto důvodu není splněno y.id_type ='nějaký typ', takže ty řádky, kde není shoda, jsou zahozeny, což fakticky změnilo toto na vnitřní spojení.
Stručně řečeno:u vnitřních spojení nezáleží na tom, kde jsou podmínky, ale u vnějších může.