El funcionamiento interno en el motor de la base de datos es diferente, tanto en lo que se refiere al plan de consulta, como en el uso de índices.
La forma
WHERE t1.codigo = t2.codigo es totalmente desaconsejable, ya que los DBMS no la pueden optimizar fuera del uso de índices, en cambio el uso de la fomra
Código SQL:
Ver originalSELECT * FROM tabla1 [LEFT|RIGHT|INNER] JOIN TABLA2 ON TABLA1.codigo = TABLA2.codigo;
si puede ser realizado utilizando más recursos.
Esencialmente, cuando usas el WHERE, el DBMS no sabe a priori cuántas coincidencias habrá, salvo que el campo relacionado sea de cardinalidad 1:1, o existan índices definidos en esos campos (Ver caso
SQL Server); en todo el resto de los casos deberá realizar una comparación tal que puede implicar leer más de la mitad de las tablas, con lo que directamente descarta los índices y pasa a leer todo... con una gran pérdida de recursos.
En cambio, el uso de FORM ... [LEFT|RIGHT|INNER] JOIN ..., permite realizar una lectura por varios métodoscuya implementación varía de acuerdo a la lógica del DBMS, y de las estadísticas realizadas (estas son parte del corazón de los DBMS). En cualquiera de ellos, los resultados reportan un costo de consulta menor con los JOIN que con el WHERE.
Aquí tienes un tutorial que hace una explicación bastante buena del funcionamiento del JOIN en las consultas:
Consultas combinadas. JOINS
En cuanto a MySQL:
7.2.9. Cómo optimiza MySQL los LEFT JOIN y RIGHT JOIN