For indre sammenføjninger som denne er de logisk ækvivalente. Du kan dog løbe ind i situationer, hvor en betingelse i join-klausulen betyder noget andet end en betingelse i where-klausulen.
Som en simpel illustration, forestil dig, at du laver en venstre join som sådan;
select x.id
from x
left join y
on x.id = y.id
;
Her tager vi alle rækkerne fra x, uanset om der er et matchende id i y. Lad os nu sige, at vores deltagelsesbetingelse vokser - vi leder ikke kun efter match i y baseret på id'et, men også på id_type.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Igen giver dette alle rækkerne i x, uanset om der er en matching (id, id_type) i y.
Dette er dog meget anderledes:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
I denne situation vælger vi alle rækkerne af x og prøver at matche rækkerne fra y. Nu for rækker, hvor der ikke er match i y, vil y.id_type være null. På grund af det er y.id_type ='en eller anden type' ikke opfyldt, så de rækker, hvor der ikke er nogen match, kasseres, hvilket reelt gjorde dette til en indre joinforbindelse.
Lang historie kort:for indre sammenføjninger er det lige meget, hvor betingelserne går hen, men for ydre sammenføjninger kan det.