En las consultas MySQL, ¿por qué usar join en lugar de dónde?

108

Parece que al combinar dos o más tablas, podemos usar join o where. ¿Cuáles son las ventajas de una sobre la otra?

extraeee
fuente
2
Dependiendo de su uso, posiblemente tenga los mismos resultados, pero con un JOIN puede hacer otros tipos de asociaciones.
Zneak
¿Responde esto a tu pregunta? INNER JOIN ON vs WHERE cláusula
philipxy

Respuestas:

160

Cualquier consulta que involucre más de una tabla requiere alguna forma de asociación para vincular los resultados de la tabla "A" a la tabla "B". El método tradicional (ANSI-89) para hacer esto es:

  1. Enumere las tablas involucradas en una lista separada por comas en la cláusula FROM
  2. Escriba la asociación entre las tablas en la cláusula WHERE

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id

Aquí está la consulta reescrita usando la sintaxis ANSI-92 JOIN:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

Desde una perspectiva de desempeño:


Donde sea compatible (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), no hay ningún beneficio de rendimiento al usar cualquiera de las sintaxis sobre la otra. El optimizador los ve como la misma consulta. Pero las consultas más complejas pueden beneficiarse del uso de la sintaxis ANSI-92:

  • Capacidad para controlar el orden de JOIN: el orden en que se escanean las tablas
  • Capacidad para aplicar criterios de filtro en una mesa antes de unirse

Desde una perspectiva de mantenimiento:


Existen numerosas razones para utilizar la sintaxis ANSI-92 JOIN sobre ANSI-89:

  • Más legible, ya que los criterios JOIN están separados de la cláusula WHERE
  • Es menos probable que pierda los criterios de JOIN
  • Soporte de sintaxis consistente para tipos JOIN distintos a INNER, lo que facilita el uso de consultas en otras bases de datos
  • La cláusula DONDE solo sirve como filtración del producto cartesiano de las tablas unidas

Desde una perspectiva de diseño:


La sintaxis ANSI-92 JOIN es patrón, no anti-patrón:

  • El propósito de la consulta es más obvio; las columnas utilizadas por la aplicación son claras
  • Sigue la regla de modularidad sobre el uso de mecanografía estricta siempre que sea posible. Explícito es casi universalmente mejor.

Conclusión


A falta de familiaridad y / o comodidad, no veo ningún beneficio en continuar usando la cláusula ANSI-89 WHERE en lugar de la sintaxis ANSI-92 JOIN. Algunos pueden quejarse de que la sintaxis ANSI-92 es más detallada, pero eso es lo que la hace explícita. Cuanto más explícito, más fácil de entender y mantener.

Ponis dios mio
fuente
14
"... Cualquier consulta que involucre más de una tabla requiere alguna forma de asociación para vincular los resultados de la tabla 'A' a la tabla 'B' ... De lo contrario, obtendrá un Producto cartesiano, y probablemente no lo desee (esos cartesianos hacen productos PESOSOS)
Scott Smith
8

La mayoría de las personas tienden a encontrar la sintaxis JOIN un poco más clara en cuanto a qué se une a qué. Además, tiene la ventaja de ser un estándar.

Personalmente, "crecí" en WHERE, pero cuanto más uso la sintaxis JOIN, más empiezo a ver cómo es más claro.

James Cronen
fuente
1
@nawfal Entiendo: me criaron con la sintaxis de estilo antiguo, pero una vez que me acostumbré a la nueva, los beneficios se hicieron claros, por ejemplo, más difícil hacer una unión cruzada por error, más explícito, más fácil de ver qué es una combinación y qué un filtro, etc ... Me enganché.
Básico
8

Estos son los problemas con el uso de la sintaxis where (también conocida como unión implícita):

Primero, es muy fácil obtener combinaciones cruzadas accidentales porque las condiciones de combinación no están junto a los nombres de las tablas. Si tiene 6 tablas unidas, es fácil pasar por alto una en la cláusula where. Verá que esto se corrige con demasiada frecuencia al usar la palabra clave distinta. Este es un gran impacto en el rendimiento de la base de datos. No puede obtener una combinación cruzada accidental utilizando la sintaxis de combinación explícita, ya que fallará la verificación de sintaxis.

Las uniones derecha e izquierda son problemáticas (en el servidor SQl no se garantiza que obtendrá los resultados correctos) en la sintaxis anterior en algunas bases de datos. Además, están en desuso en SQL Server, lo sé.

Si tiene la intención de utilizar una combinación cruzada, eso no está claro en la sintaxis anterior. Está claro usando el estándar ANSII actual.

Es mucho más difícil para el mantenedor ver exactamente qué campos forman parte de la combinación o incluso qué tablas se unen en qué orden utilizando la sintaxis implícita. Esto significa que podría llevar más tiempo revisar las consultas. He conocido a muy pocas personas que, una vez que se tomaron el tiempo para sentirse cómodos con la sintaxis de unión explícita, alguna vez volvieron a la forma antigua.

También he notado que algunas personas que usan estas uniones implícitas no entienden realmente cómo funcionan las uniones y, por lo tanto, obtienen resultados incorrectos en sus consultas.

Honestamente, ¿usaría algún otro tipo de código que fue reemplazado por un método mejor hace 18 años?

HLGEM
fuente
6

Las combinaciones explícitas transmiten la intención, dejando que la cláusula where realice el filtrado. Es más limpio y estándar, y puede hacer cosas como el exterior izquierdo o el exterior derecho, que es más difícil de hacer solo con dónde.

Otávio Décio
fuente
3

No puede usar WHERE para combinar dos tablas. Sin embargo, lo que puedes hacer es escribir:

SELECT * FROM A, B
WHERE ...

La coma aquí es equivalente a escribir:

SELECT *
FROM A
CROSS JOIN B
WHERE ...

¿Escribirías eso? No, porque no es a lo que te refieres en absoluto. No quiere una unión cruzada, quiere una INNER JOIN. Pero cuando escribe una coma, está diciendo CROSS JOIN y eso es confuso.

Mark Byers
fuente
0

En realidad, a menudo necesita tanto "DÓNDE" como "UNIRSE".

"JOIN" se utiliza para recuperar datos de dos tablas, basándose en los valores de una columna común. Si luego desea filtrar más este resultado, use la cláusula WHERE.

Por ejemplo, "LEFT JOIN" recupera TODAS las filas de la tabla izquierda, más las filas coincidentes de la tabla derecha. Pero eso no filtra los registros en ningún valor específico o en otras columnas que no forman parte de JOIN. Por lo tanto, si desea filtrar más este resultado, especifique los filtros adicionales en la cláusula WHERE.

Gerhard Liebenberg
fuente