Para uniones internas como esta, son lógicamente equivalentes. Sin embargo, puede encontrarse con situaciones en las que una condición en la cláusula de unión signifique algo diferente a una condición en la cláusula where.
Como una ilustración simple, imagina que haces una combinación izquierda como esta;
select x.id
from x
left join y
on x.id = y.id
;
Aquí estamos tomando todas las filas de x, independientemente de si hay una identificación coincidente en y. Ahora digamos que nuestra condición de combinación crece:no solo buscamos coincidencias en y en función del id, sino también de id_type.
select x.id
from x
left join y
on x.id = y.id
and y.id_type = 'some type'
;
Nuevamente, esto da todas las filas en x sin importar si hay una coincidencia (id, id_type) en y.
Sin embargo, esto es muy diferente:
select x.id
from x
left join y
on x.id = y.id
where y.id_type = 'some type'
;
En esta situación, seleccionamos todas las filas de x e intentamos hacer coincidir las filas de y. Ahora, para las filas para las que no hay coincidencia en y, y.id_type será nulo. Por eso, y.id_type ='algún tipo' no está satisfecho, por lo que aquellas filas donde no hay coincidencias se descartan, lo que efectivamente convirtió esto en una unión interna.
Para resumir:para las uniones internas no importa adónde vayan las condiciones, pero para las uniones externas sí.