Parece que al combinar dos o más tablas, podemos usar join o where. ¿Cuáles son las ventajas de una sobre la otra?
Parece que al combinar dos o más tablas, podemos usar join o where. ¿Cuáles son las ventajas de una sobre la otra?
Respuestas:
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:
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
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:
Existen numerosas razones para utilizar la sintaxis ANSI-92 JOIN sobre ANSI-89:
La sintaxis ANSI-92 JOIN es patrón, no anti-patró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.
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.
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?
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.
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.
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.