sql >> Base de Datos >  >> RDS >> Mysql

Unirse a la izquierda o seleccionar de varias tablas usando una coma (,)

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í.