complejas - En las consultas de MySQL, ¿por qué usar join en lugar de where?
consultas en postgresql pdf (6)
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 medio tradicional (ANSI-89) de hacer esto es:
- Enumere las tablas involucradas en una lista separada por comas en la cláusula FROM
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 rendimiento:
Donde se admite (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), no hay beneficio en el rendimiento al usar una 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:
- Posibilidad de controlar el orden JOIN - el orden en que se escanean las tablas
- Posibilidad de aplicar criterios de filtro en una tabla antes de unirse
Desde una perspectiva de mantenimiento:
Hay numerosas razones para usar la sintaxis ANSI-92 JOIN sobre ANSI-89:
- Más legible, ya que el criterio JOIN es independiente de la cláusula WHERE
- Menos probabilidades de perder los criterios de JOIN
- Soporte consistente de sintaxis para tipos JOIN distintos de INNER, haciendo que las consultas sean fáciles de usar 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 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 la tipificación 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 sintaxis ANSI-89 JOIN en lugar de la sintaxis ANSI-92. Algunos pueden quejarse de que la sintaxis ANSI-92 es más detallada, pero eso es lo que lo hace explícito. Cuanto más explícito, más fácil es de entender y mantener.
Parece que se combinan dos o más tablas, podemos usar join o where. ¿Cuáles son las ventajas de una sobre la otra?
Estos son los problemas con el uso de la sintaxis where (también conocida como la combinación implícita):
En primer lugar, es demasiado fácil obtener uniones cruzadas accidentales porque las condiciones de unión no están justo al lado de los nombres de la tabla. Si tiene 6 tablas unidas, es fácil omitir una en la cláusula where. Verá esto a menudo con la palabra clave distinta. Este es un gran logro de rendimiento para la base de datos. No se puede obtener una combinación cruzada accidental utilizando la sintaxis de combinación explícita, ya que fallará la comprobación de sintaxis.
Las combinaciones derecha e izquierda son problemáticas (en el servidor SQl no se garantiza que obtengas 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 son parte de la unión o incluso qué tablas se unen en qué orden usando la sintaxis implícita. Esto significa que puede 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 explícita de las uniones, alguna vez volvieron al viejo estilo.
También he notado que algunas personas que usan estas combinaciones implícitas no entienden realmente cómo funcionan las uniones y, por lo tanto, obtienen resultados incorrectos en sus consultas.
Honestamente, ¿usarías algún otro tipo de código que fue reemplazado por un método mejor hace 18 años?
La mayoría de las personas tienden a encontrar la sintaxis JOIN un poco más clara en cuanto a qué se está uniendo a qué. Además, tiene el beneficio de ser un estándar.
Personalmente, "crecí" en WHEREEs, pero cuanto más uso la sintaxis JOIN, más estoy comenzando a ver cómo es más claro.
Las combinaciones explícitas transmiten la intención, dejando la cláusula where para hacer el filtrado. Es más limpio y es estándar, y usted puede hacer cosas tales como exterior izquierdo o derecho externo, lo cual es más difícil de hacer solo con dónde.
No puede usar DÓNDE combinar dos tablas. 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 lo que quieres decir en absoluto. No desea una combinación cruzada, quiere una UNIÓN INTERNA. Pero cuando escribes una coma, estás diciendo que CROSS JOIN es confuso.
En realidad, a menudo necesita tanto "DONDE" como "UNIRSE".
"JOIN" se utiliza para recuperar datos de dos tablas, según los valores de una columna común. Si luego desea filtrar aún más este resultado, use la cláusula WHERE.
Por ejemplo, "LEFT JOIN" recupera TODAS las filas de la tabla de la izquierda, más las filas correspondientes de la tabla de la derecha. Pero eso no filtra los registros en ningún valor específico ni en otras columnas que no forman parte de JOIN. Por lo tanto, si desea filtrar aún más este resultado, especifique los filtros adicionales en la cláusula WHERE.