För inre sammanfogningar som denna är de logiskt likvärdiga. Du kan dock stöta på situationer där ett villkor i join-satsen betyder något annat än ett villkor i where-satsen.
Som en enkel illustration, föreställ dig att du gör en vänsteranslutning som så;
select x.id
from x
left join y
on x.id = y.id
;
Här tar vi alla rader från x, oavsett om det finns ett matchande id i y. Låt oss nu säga att vårt anslutningsvillkor växer - vi letar inte bara efter matchningar i y baserat på id utan också på id_type.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Återigen ger detta alla rader i x oavsett om det finns en matchning (id, id_type) i y.
Detta är dock väldigt annorlunda:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
I den här situationen väljer vi alla rader av x och försöker matcha till rader från y. Nu för rader för vilka det inte finns någon matchning i y, kommer y.id_type att vara null. På grund av det är y.id_type ='någon typ' inte uppfylld, så de rader där det inte finns någon matchning kasseras, vilket i praktiken gjorde detta till en inre koppling.
Lång historia kort:för inre fogar spelar det ingen roll var förutsättningarna går, men för yttre fogar kan det göra det.