Für innere Verknüpfungen wie diese sind sie logisch äquivalent. Es kann jedoch vorkommen, dass eine Bedingung in der Join-Klausel etwas anderes bedeutet als eine Bedingung in der Where-Klausel.
Stellen Sie sich zur einfachen Veranschaulichung vor, Sie führen eine Linksverknüpfung wie folgt aus:
select x.id
from x
left join y
on x.id = y.id
;
Hier nehmen wir alle Zeilen von x, unabhängig davon, ob es eine passende ID in y gibt. Nehmen wir nun an, unsere Join-Bedingung wächst - wir suchen nicht nur nach Übereinstimmungen in y basierend auf der ID, sondern auch auf dem ID_Typ.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Auch dies ergibt alle Zeilen in x, unabhängig davon, ob es eine Übereinstimmung (id, id_type) in y gibt.
Dies ist jedoch sehr unterschiedlich:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
In dieser Situation wählen wir alle Zeilen von x aus und versuchen, die Zeilen von y abzugleichen. Nun ist für Zeilen, für die es keine Übereinstimmung in y gibt, y.id_type null. Aus diesem Grund ist y.id_type ='some type' nicht erfüllt, sodass die Zeilen, in denen es keine Übereinstimmung gibt, verworfen werden, wodurch dies effektiv zu einem Inner Join wurde.
Um es kurz zu machen:Für Inner Joins spielt es keine Rolle, wohin die Bedingungen gehen, aber für Outer Joins schon.