Voor inner joins zoals deze zijn ze logisch equivalent. U kunt echter situaties tegenkomen waarin een voorwaarde in de join-clausule iets anders betekent dan een voorwaarde in de where-clausule.
Stel je als eenvoudige illustratie voor dat je zo een left join doet;
select x.id
from x
left join y
on x.id = y.id
;
Hier nemen we alle rijen van x, ongeacht of er een overeenkomende id in y is. Laten we nu zeggen dat onze deelnamevoorwaarde groeit - we zoeken niet alleen naar overeenkomsten in y op basis van de id, maar ook op id_type.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Dit geeft opnieuw alle rijen in x, ongeacht of er een overeenkomst (id, id_type) in y is.
Dit is echter heel anders:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
In deze situatie kiezen we alle rijen van x en proberen we te matchen met rijen van y. Voor rijen waarvoor er geen overeenkomst is in y, is y.id_type null. Daarom is er niet voldaan aan y.id_type ='some type', dus de rijen waar geen match is, worden weggegooid, waardoor dit in feite een inner join is geworden.
Om een lang verhaal kort te maken:voor inner joins maakt het niet uit waar de omstandigheden heen gaan, maar voor outer joins wel.