Dla sprzężeń wewnętrznych takich jak to są one logicznie równoważne. Możesz jednak napotkać sytuacje, w których warunek w klauzuli join oznacza coś innego niż warunek w klauzuli where.
Jako prostą ilustrację wyobraź sobie, że robisz lewe sprzężenie w ten sposób;
select x.id
from x
left join y
on x.id = y.id
;
Tutaj bierzemy wszystkie wiersze z x, niezależnie od tego, czy w y jest pasujący identyfikator. Załóżmy teraz, że nasz warunek dołączenia rośnie — szukamy nie tylko dopasowań w y na podstawie identyfikatora, ale także id_type.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Ponownie daje to wszystkie wiersze w x, niezależnie od tego, czy istnieje dopasowanie (id, id_type) w y.
To jednak jest zupełnie inne:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
W tej sytuacji wybieramy wszystkie rzędy x i próbujemy dopasować do rzędów od y. Teraz dla wierszy, dla których nie ma dopasowania w y, y.id_type będzie miał wartość null. Z tego powodu y.id_type ='jakiś typ' nie jest spełniony, więc te wiersze, w których nie ma dopasowania, są odrzucane, co skutecznie zmieniło to w sprzężenie wewnętrzne.
Krótko mówiąc:w przypadku złączeń wewnętrznych nie ma znaczenia, jakie warunki idą, ale w przypadku złączeń zewnętrznych tak.