En primer lugar, para que sea completamente equivalente, la primera consulta debería haber sido escrita
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT *
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
De modo que mw.* y nvs.* juntos producen el mismo conjunto que el singular de la segunda consulta *. La consulta como ha escrito puede usar un INNER JOIN, ya que incluye un filtro en nvs.correct.
La forma general
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
para encontrar registros de TableB basados en la condición. Si falla, se mantienen los resultados de TABLEA, con todas las columnas de TableB establecidas en NULL. En contraste
TABLEA INNER JOIN TABLEB ON <CONDITION>
también attempts
para encontrar registros de TableB basados en la condición. Sin embargo , cuando falla, el registro particular de TableA se elimina del conjunto de resultados de salida.
El estándar ANSI para CROSS JOIN produce un Producto cartesiano entre las dos mesas.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
La intención de la sintaxis es que CADA fila en TABLEA se una a CADA fila en TABLEB. Entonces, 4 filas en A y 3 filas en B producen 12 filas de salida. Cuando se combina con condiciones en la cláusula WHERE, a veces produce el mismo comportamiento de INNER JOIN, ya que expresan lo mismo (condición entre A y B => mantener o no). Sin embargo, es mucho más claro cuando se lee la intención cuando usa INNER JOIN en lugar de comas.
En cuanto al rendimiento, la mayoría de los DBMS procesarán una unión IZQUIERDA más rápido que una UNIÓN INTERNA. La notación de coma puede hacer que los sistemas de bases de datos malinterpreten la intención y produzcan un mal plan de consulta, por lo que otra ventaja para la notación SQL92.
¿Por qué necesitamos LEFT JOIN? Si la explicación de LEFT JOIN anterior aún no es suficiente (mantener registros en A sin coincidencias en B), entonces considere que para lograr lo mismo, necesitaría una UNIÓN compleja entre dos conjuntos usando la antigua notación de coma para lograr el mismo efecto . Pero como se dijo anteriormente , esto no se aplica a su ejemplo, que en realidad es una UNIÓN INTERNA que se esconde detrás de una UNIÓN IZQUIERDA.
Notas:
- RIGHT JOIN es lo mismo que LEFT, excepto que comienza con TABLEB (lado derecho) en lugar de A.
- Las combinaciones DERECHA e IZQUIERDA son combinaciones EXTERNAS. La palabra OUTER es opcional, es decir, se puede escribir como
LEFT OUTER JOIN
. - El tercer tipo de combinación EXTERNA es la combinación EXTERNA COMPLETA, pero eso no se analiza aquí.