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

Resuelto extraeee asked hace 14 años • 6 respuestas

Parece combinar dos o más tablas, podemos usar unir o dónde. ¿Cuáles son las ventajas de uno sobre el otro?

extraeee avatar Feb 11 '10 10:02 extraeee
Aceptado

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

  1. Enumere las tablas involucradas en una lista separada por comas en la cláusula FROM
  2. Escribe 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 rendimiento:


Cuando 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 UNIRSE: el orden en el que se escanean las tablas
  • Posibilidad de 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 en lugar de ANSI-89:

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

Desde una perspectiva de diseño:


La sintaxis de ANSI-92 JOIN es un patrón, no un antipatró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 tipificación estricta siempre que sea posible. Lo 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 podrían 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 será de entender y mantener.

OMG Ponies avatar Feb 11 '2010 03:02 OMG Ponies

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

Primero, es muy fácil obtener uniones cruzadas accidentales porque las condiciones de unión no están justo al lado de los nombres de las tablas. Si tiene 6 tablas unidas, es fácil perder una en la cláusula dónde. Verá que esto se soluciona con demasiada frecuencia mediante el uso de la palabra clave distinta. Este es un gran impacto en el rendimiento de la base de datos. No puede obtener una unión cruzada accidental utilizando la sintaxis de unión explícita, ya que no pasará la verificación de sintaxis.

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

Si tiene la intención de utilizar una unión cruzada, eso no queda claro en la sintaxis anterior. Queda claro utilizando el estándar ANSII actual.

Es mucho más difícil para el mantenedor ver exactamente qué campos son parte de la unión o incluso qué tablas se unen en qué orden usando 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ómodas con la sintaxis de unión explícita, volvieron a la antigua usanza.

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

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

HLGEM avatar Feb 11 '2010 15:02 HLGEM

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í" con WHERE, pero cuanto más uso la sintaxis JOIN, más empiezo a ver que es más claro.

James Cronen avatar Feb 11 '2010 03:02 James Cronen

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

Otávio Décio avatar Feb 11 '2010 03:02 Otávio Décio