IZQUIERDA IZQUIERDA versus IZQUIERDA EXTERIOR UNIRSE en SQL Server

1595

¿Cuál es la diferencia entre LEFT JOINy LEFT OUTER JOIN?

KG Sosa
fuente
213
¡Ninguna! La OUTERpalabra clave es opcional.
jarlh
99
Los diagramas de Venn no son apropiados para las respuestas a esta pregunta. La respuesta a esta pregunta es Ninguna . Ver el primer comentario.
Filipinas
3
Los diagramas de Venn ilustran la diferencia en las filas de salida para casos especiales de unión interna vs externa . Si no se ingresan nulos o filas duplicadas (por lo que podemos tomar una tabla como un conjunto de valores con valores de fila y usar la igualdad matemática normal) , los círculos izquierdo y derecho contienen tablas / conjuntos de salida de combinación izquierda y derecha . Pero si se ingresan nulos o filas duplicadas, entonces es tan difícil explicar de qué son los conjuntos de círculos y cómo esos conjuntos se relacionan con las tablas / bolsas de entrada y salida que los diagramas de Venn no son útiles. Vea mis comentarios aquí sobre otros abusos del diagrama de Venn.
philipxy

Respuestas:

2237

Según la documentación: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

La palabra clave OUTERestá marcada como opcional (encerrada entre corchetes). En este caso específico, si especificas OUTERo no, no hay diferencia. Tenga en cuenta que si bien los otros elementos de la cláusula de unión también están marcados como opcionales, dejarlos fuera marcará la diferencia.

Por ejemplo, toda la parte tipo de la JOINcláusula es opcional, en cuyo caso el valor predeterminado es INNERsi solo especifica JOIN. En otras palabras, esto es legal:

SELECT *
FROM A JOIN B ON A.X = B.Y

Aquí hay una lista de sintaxis equivalentes:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

También eche un vistazo a la respuesta que dejé en esta otra pregunta SO: ¿ SQL dejó unirse frente a varias tablas en la línea FROM? .

ingrese la descripción de la imagen aquí

Lasse V. Karlsen
fuente
135
Absolutamente correcto. OUTER está permitido para la compatibilidad ANSI-92.
Sean Reilly el
11
@ LasseV.Karlsen ¿no sería mejor tener INNER JOINa la derecha y solo JOINa la izquierda en la lista de equivalentes?
nawfal
8
@ LasseV.Karlsen Solo quise decir que el lado izquierdo tiene la forma concisa y el lado derecho tiene la forma expandida. Pensé que sería coherente si seguías lo mismo para JOINs también.
nawfal
30
@Outlier Esa es su prerrogativa, pero claramente otras 451 personas pensaron que la respuesta era buena. Para ser sincero, si una respuesta dice X y otra dice X y hace referencia a la documentación, además de copiar las piezas relevantes de la documentación en la respuesta, mi voto va a la segunda respuesta y es por eso que escribo mis respuestas de la manera Hago. Que alguien afirme que X no es bueno. Si puedes probar X, eso es mejor (no a la ligera respuesta de sactiw). Pero, es tu prerrogativa pensar lo que quieras. Sin embargo, me pregunto por qué piensas que no tiene sentido, ¿la respuesta es incorrecta de alguna manera?
Lasse V. Karlsen
77
@Outlier Y para ser honesto, si no tienes ganas de leer mis "largas" respuestas, entonces mi respuesta no fue para ti. Es para todos los que vienen aquí preguntándose acerca de lo mismo y quieren tener una idea de por qué, y dónde encontrar más información, etc. Claramente, usted es el tipo de persona que desearía esta respuesta: "Ninguno", pero desafortunadamente esto no es una respuesta legal aquí en Stack Overflow, ni debería serlo.
Lasse V. Karlsen
700

Para responder a su pregunta, no hay diferencia entre LEFT JOIN y LEFT OUTER JOIN, son exactamente lo mismo que dijo ...

En el nivel superior hay principalmente 3 tipos de combinaciones:

  1. INTERIOR
  2. EXTERIOR
  3. CRUZAR

  1. UNIÓN INTERNA : obtiene datos si están presentes en ambas tablas.

  2. OUTER JOIN son de 3 tipos:

    1. LEFT OUTER JOIN - busca datos si están presentes en la tabla de la izquierda.
    2. RIGHT OUTER JOIN - busca datos si están presentes en la tabla correcta.
    3. FULL OUTER JOIN - busca datos si están presentes en cualquiera de las dos tablas.
  3. CROSS JOIN , como su nombre indica, hace [n X m]que todo se una a todo.
    Similar al escenario donde simplemente enumeramos las tablas para unir (en la FROMcláusula de la SELECTdeclaración), usando comas para separarlas.


Puntos a tener en cuenta:

  • Si solo lo menciona JOIN, por defecto es a INNER JOIN.
  • Una OUTERunión tiene que ser LEFT| RIGHTEl | FULLNo puedes simplemente decir OUTER JOIN.
  • Puede soltar la OUTERpalabra clave y simplemente decir LEFT JOINo RIGHT JOINo FULL JOIN.

Para aquellos que quieran visualizarlos de una mejor manera, diríjase a este enlace: Una explicación visual de las uniones SQL

sactiw
fuente
17
Muy buena respuesta. Será más claro si dice "IZQUIERDA EXTERIOR IZQUIERDA: recupera todos los datos de la tabla izquierda con los datos coincidentes de la derecha, si está preestablecido". para 2.1 (y un cambio similar para 2.2)
ssh
1
También puede hacer una unión cruzada simplemente 'seleccione * de la
Tabla A
3
Lo siento si estoy necrobumping, pero es CROSS JOINlo mismo que FULL JOIN?
TechnicalTophat
99
@RhysO no, CROSS JOIN es un producto cartesiano, es decir, CROSS JOIN de una tabla, que tiene n filas, con una tabla, que tiene m filas, siempre dará (n * m) filas mientras que FULL OUTER JOIN de una tabla, que tiene n filas, con una mesa, que tiene m filas, dará en max (n + m) filas
sactiw
1
@sactiw considera agregar una nota especial en su valiosa respuesta sobre la diferencia entre Cross Joiny Full Outer Join... de alguna manera parece similar.
Manuel Jordan
356

¿Cuál es la diferencia entre la unión izquierda y la unión externa izquierda?

Nada . LEFT JOINy LEFT OUTER JOINson equivalentes

Trigo Mitch
fuente
13
erm hola! ¿Quién votó por esto? LEFT JOIN es lo mismo que LEFT OUTER JOIN.
Mitch Wheat
77
Este es el caso en Microsoft SQL Server y en cualquier otro RDBMS compatible con SQL.
Bill Karwin el
77
Sería bueno si agregara una referencia o explicación sobre por qué OUTERes opcional.
Zero3
77
La respuesta más concisa y precisa aquí.
Manachi
44
Gracias. La respuesta aceptada tenía demasiada información que me dejó más confundido. Esto es exactamente lo que necesitaba saber y responde a la pregunta original directamente al grano.
Bacon Brad
66

Soy un DBA PostgreSQL, por lo que pude entender, la diferencia entre las diferencias externas o no externas es un tema que tiene una discusión considerable en Internet. Hasta hoy nunca vi una diferencia entre esos dos; Así que fui más allá y trato de encontrar la diferencia entre ellos. Al final leí toda la documentación al respecto y encontré la respuesta para esto,

Entonces, si busca documentación (al menos en PostgreSQL), puede encontrar esta frase:

"Las palabras INNERy OUTERson opcionales en todas las formas. INNEREstá el defecto; LEFT, RIGHTy FULLimplican una combinación externa".

En otras palabras,

LEFT JOINy LEFT OUTER JOINSON LOS MISMOS

RIGHT JOINy RIGHT OUTER JOINSON LOS MISMOS

Espero que pueda ser una contribución para aquellos que todavía están tratando de encontrar la respuesta.

andrefsp
fuente
60

Left Joiny Left Outer Joinson uno y lo mismo . La primera es la abreviatura de la segunda. Lo mismo puede decirse de la Right Joiny Right Outer Joinrelación. La demostración ilustrará la igualdad. Se han proporcionado ejemplos de trabajo de cada consulta a través de SQL Fiddle . Esta herramienta permitirá la manipulación práctica de la consulta.

Dado

ingrese la descripción de la imagen aquí

Unión izquierda y unión exterior izquierda

ingrese la descripción de la imagen aquí

Resultados

ingrese la descripción de la imagen aquí


Unión derecha y unión externa derecha

ingrese la descripción de la imagen aquí

Resultados

ingrese la descripción de la imagen aquí

WorkSmarter
fuente
43

Me resulta más fácil pensar en las Uniones en el siguiente orden:

  • CROSS JOIN: un producto cartesiano de ambas tablas. TODAS las uniones comienzan aquí
  • UNIÓN INTERNA: una UNIÓN CRUZADA con un filtro agregado.
  • OUTER JOIN: una UNIÓN INTERNA con elementos faltantes (de la tabla IZQUIERDA o DERECHA) añadidos después.

Hasta que descubrí este modelo (relativamente) simple, JOINS siempre fue un poco más un arte negro. Ahora tienen mucho sentido.

Espero que esto ayude más de lo que confunde.

frozenjim
fuente
Esto no responde la pregunta.
philipxy
33

¿Por qué IZQUIERDA / DERECHA e IZQUIERDA EXTERIOR / DERECHA EXTERIOR son iguales? Vamos a explicar por qué este vocabulario. Comprenda que las uniones IZQUIERDA y DERECHA son casos específicos de la unión EXTERIOR y, por lo tanto, no pueden ser más que OUTER LEFT / OUTER RIGHT. La combinación OUTER también se denomina FULL OUTER en oposición a las combinaciones LEFT y RIGHT que son resultados PARCIALES de la combinación OUTER. En efecto:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Ahora está claro por qué esas operaciones tienen alias, así como también está claro que solo existen 3 casos: INTERIOR, EXTERIOR, CRUZ. Con dos sub-casos para el EXTERIOR. El vocabulario, la forma en que los maestros explican esto, así como algunas respuestas anteriores, a menudo hacen que parezca que hay muchos tipos diferentes de unión. Pero en realidad es muy simple.

Yugo Amaryl
fuente
1
"está claro que solo existen 3 casos": interesante pero defectuoso. Considere que una unión interna es una unión cruzada especializada (es decir, mover predicados de unión a la cláusula where). Además, considere que la combinación externa no es una combinación en absoluto, sino que es una unión donde se utilizan nulos en lugar de columnas 'faltantes'. Por lo tanto, se podría argumentar que la cruz es la única unión requerida. Tenga en cuenta que el pensamiento actual en la teoría relacional es que la unión natural satisface todos los requisitos de unión. Aparte: ¿puede explicar si / cómo el vocabulario " JOINimplica INNER JOIN" encaja con su razonamiento para el vocabulario de unión externa?
cuando el
27

Para responder tu pregunta

En SQL Server se une a la sintaxis OUTER es opcional

Se menciona en el artículo de msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Entonces, la siguiente lista muestra unir sintaxis equivalentes con y sin OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Otras sintaxis equivalentes

INNER JOIN => JOIN
CROSS JOIN => ,

Recomiendo encarecidamente Dotnet Mob Artice: se une al servidor SQL ingrese la descripción de la imagen aquí

masa
fuente
2
Re abuso de los diagramas de Venn aquí ver mi comentario sobre la pregunta.
philipxy
20

Solo hay 3 combinaciones:

  • A) Cross Cross = Cartesian (Ej .: Tabla A, Tabla B)
  • B) Unión interna = UNIR (Ej .: Tabla A Unión / Tabla de Unión interna B)
  • C) Unión externa:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Espero que ayude.

Delickate
fuente
1
Entonces 5 se unen por completo.
Zeek2
19

Hay principalmente tres tipos de UNIRSE

  1. Interior: recupera datos que están presentes en ambas tablas
    • Solo UNIR significa UNIR INTERIOR
  2. Exterior: son de tres tipos.

    • IZQUIERDA EXTERIOR - - recupera los datos presentes solo en la tabla izquierda y la condición coincidente
    • EXTERIOR DERECHA: recupera los datos presentes solo en la tabla derecha y en la condición correspondiente
    • FULL OUTER -: recupera los datos presentes en cualquiera de las tablas o en ambas
    • (IZQUIERDA, DERECHA o COMPLETA) OUTER JOIN puede escribirse sin escribir "OUTER"
  3. Cross Join: une todo a todo

Duro
fuente
16

El azúcar sintáctico hace que sea más obvio para el lector casual que la unión no es interna.

Sin cortar
fuente
2
Entonces ... ¿qué es una UNIÓN COMPLETA EXTERIOR entonces?
Amy B
55
tableA FULL OUTER JOIN tableB le dará tres tipos de registros: todos los registros en la tabla A sin registro coincidente en la tabla B, todos los registros en la tabla B sin registro coincidente en la tabla A y todos los registros en la tabla A con un registro coincidente en la tabla B.
Dave DuPlantis el
4

Solo en el contexto de esta pregunta, quiero publicar también los 2 operadores 'APLICAR':

UNE :

  1. UNIÓN INTERNA = UNIRSE

  2. ÚNETE EXTERIOR

    • IZQUIERDA EXTERIOR UNIR = IZQUIERDA UNIR

    • DERECHA EXTERIOR UNIR = DERECHA UNIR

    • FULL OUTER JOIN = FULL JOIN

  3. UNIÓN CRUZADA

SELF-JOIN : este no es exactamente un tipo separado de combinación. Básicamente, esto es unir una tabla a sí mismo utilizando una de las combinaciones anteriores. Pero sentí que vale la pena mencionarlo en el contexto ÚNASE a las discusiones, ya que escuchará este término de muchos en la comunidad de Desarrolladores SQL.

APLICAR :

  1. APLICACIÓN CRUZADA : similar a INNER JOIN (pero ha agregado la ventaja de poder calcular algo en la tabla derecha para cada fila de la tabla izquierda y devolvería solo las filas coincidentes)
  2. APLICACIÓN EXTERNA : similar a IZQUIERDA EXTERIOR (pero ha agregado la ventaja de poder calcular algo en la tabla derecha para cada fila de la tabla izquierda y devolvería todas las filas de la tabla izquierda independientemente de una coincidencia en la tabla derecha)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Ejemplo de la vida real, cuándo usar OUTER / CROSS APPLY en SQL

Encuentro que el operador APPLY es muy beneficioso ya que ofrecen un mejor rendimiento que tener que hacer el mismo cálculo en una subconsulta. También reemplazan muchas funciones analíticas en versiones anteriores de SQL Server. Es por eso que creo que después de estar cómodo con JOINS, un desarrollador de SQL debería intentar aprender los operadores APLICAR a continuación.

san
fuente