¿Cuál es el comportamiento predeterminado de MySQL JOIN, INNER u OUTER?

92

Así que he estado buscando en Internet la última hora, leyendo y buscando la respuesta definitiva a esta simple pregunta.

¿Cuál es el JOIN predeterminado en MySQL?

SELECT * FROM t1 JOIN t2

¿Es lo mismo que

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

También una pregunta relacionada, cuando usa las cláusulas "WHERE", ¿es lo mismo que JOIN o INNER JOIN?

En este momento estoy pensando que un JOIN independiente es idéntico al uso de comas y cláusulas WHERE.

Quang Van
fuente

Respuestas:

125

En MySQL, la escritura JOINno calificada implica INNER JOIN. En otras palabras, el INNERde INNER JOINes opcional. INNERy CROSSson sinónimos en MySQL. Para mayor claridad, escribo JOINo INNER JOINsi tengo una condición de unión y CROSS JOINsi no tengo una condición.

La sintaxis permitida para las combinaciones se describe en la documentación .


En este momento, estoy pensando que un JOIN independiente no es más que (idéntico a) usar comas y cláusulas WHERE.


El efecto es el mismo, pero la historia detrás de ellos es diferente. La sintaxis de la coma es del estándar ANSI-89. Sin embargo, hay varios problemas con esta sintaxis, por lo que en el estándar ANSI-92 se introdujo la palabra clave JOIN.

Recomiendo encarecidamente que siempre use la sintaxis JOIN en lugar de la coma.

  • T1 JOIN T2 ON ...es más legible que T1, T2 WHERE ....
  • Es más fácil de mantener porque las relaciones de la tabla y los filtros están claramente definidos en lugar de mezclarse.
  • La sintaxis de JOIN es más fácil de convertir a OUTER JOIN que la sintaxis de coma.
  • Mezclar la sintaxis de coma y JOIN en la misma declaración puede dar errores curiosos debido a las reglas de precedencia.
  • Es menos probable que se cree accidentalmente un producto cartesiano cuando se usa la sintaxis JOIN debido a una cláusula de unión olvidada, porque las cláusulas de unión están escritas junto a las combinaciones y es fácil ver si falta una.
Mark Byers
fuente
Dulce, gracias por aclararme esta simple pregunta :) En el pasado, siempre usé comas + cláusulas where ... pero pasaré a usar JOINs según su consejo. Gracias
Quang Van
Hola Mark, ¿qué quieres decir con combinaciones de JOIN y comas? Mezcle consultas como esta, SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.by t4.c = t1.c)?
Quang Van
2
@Quang: Esto, por ejemplo, fallará:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers
0

Estos son todos equivalentes, y también es igual a, CROSS JOIN.

Existen algunas diferencias entre el uso de comas y [INNER | CROSS] JOINsintaxis, que pueden ser importantes al unir más tablas. Prácticamente todo lo que necesita saber se describe aquí en la documentación de MySQLJOIN .

Mchl
fuente
1
^ --- la respuesta a la pregunta es JOIN (independiente) básicamente es lo mismo que INNER y comma + where cláusulas
Quang Van