¿Cuál es la diferencia entre las uniones izquierda, derecha, externa e interna?


562

Me pregunto cómo diferenciar todas estas uniones diferentes ...



3
También depende de su nivel de comprensión, para alguien como usted ese artículo no hace nada, pero para alguien que tal vez no entienda completamente se une, es bastante claro
SQLMenace el

66
Este es un duplicado de stackoverflow.com/questions/419375/sql-join-differences y sin duda otros ...
cletus

1
Esto me ayudó mucho ... la forma más fácil es hacer tablas de prueba y jugar con ellas. = P
daGrevis

Respuestas:


797

Ejemplo simple : Digamos que tienes una Studentsmesa y una Lockersmesa. En SQL, la primera tabla que especifique en una combinación, Studentses la tabla IZQUIERDA , y la segunda Lockers, es la tabla DERECHA .

Cada estudiante puede ser asignado a un casillero, por lo que hay una LockerNumbercolumna en la Studenttabla. Potencialmente, más de un estudiante podría estar en un solo casillero, pero especialmente al comienzo del año escolar, es posible que tenga algunos estudiantes entrantes sin casilleros y algunos casilleros que no tienen alumnos asignados.

Por el bien de este ejemplo, supongamos que tiene 100 estudiantes , 70 de los cuales tienen casilleros. Tiene un total de 50 casilleros , 40 de los cuales tienen al menos 1 estudiante y 10 casilleros no tienen estudiante.

INNER JOIN es equivalente a " muéstrame a todos los estudiantes con casilleros ".
Faltan estudiantes sin casilleros o casilleros sin estudiantes.
Devuelve 70 filas

IZQUIERDA EXTERIOR UNIRSE sería " muéstrame a todos los estudiantes, con su casillero correspondiente si tienen uno ".
Esta podría ser una lista general de estudiantes, o podría usarse para identificar estudiantes sin casillero.
Devuelve 100 filas

DERECHO EXTERIOR UNIRSE sería " muéstrame todos los casilleros, y los estudiantes asignados a ellos si hay alguno ".
Esto podría usarse para identificar casilleros que no tienen estudiantes asignados, o casilleros que tienen demasiados estudiantes.
Devuelve 80 filas (lista de 70 estudiantes en los 40 casilleros, más los 10 casilleros sin estudiante)

FULL OUTER JOIN sería una tontería y probablemente no sería de mucha utilidad.
Algo así como " muéstrame todos los estudiantes y todos los casilleros, y combínalos donde puedas "
Devuelve 110 filas (los 100 estudiantes, incluidos los que no tienen casilleros. Además los 10 casilleros sin estudiante)

CROSS JOIN también es bastante tonto en este escenario.
No utiliza el lockernumbercampo vinculado en la tabla de estudiantes, por lo que básicamente terminas con una gran lista gigante de cada posible emparejamiento de estudiante a casillero, ya sea que exista o no.
Devuelve 5000 filas (100 estudiantes x 50 casilleros). Podría ser útil (con filtrado) como punto de partida para unir a los nuevos estudiantes con los casilleros vacíos.


12
Usando su ejemplo, CROSS join sería útil como punto de partida para crear asignaciones de casilleros: comience con todas las combinaciones posibles y luego use otros criterios para filtrar los resultados de la lista.
Joel Coehoorn el

1
Buena respuesta. Creo que Cross Join se usa con mayor frecuencia para generar datos de prueba de unas pocas filas cuando necesita una gran cantidad de registros.
Eli

66
FULL OUTER JOINS puede ser útil al buscar datos huérfanos o al comparar diferentes versiones del mismo conjunto de datos.
Lara Dougan

3
Cross join aka cartesian product
JavaRocky

3
Creo que cómo comienza su consulta afecta el resultado del tipo de combinación. Por ejemplo, SELECT * FROM students RIGHT OUTER JOIN lockers...daría como resultado un resultado diferente que SELECT * FROM lockers RIGHT OUTER JOIN students.... Gran respuesta, pero me encantaría verlo actualizado con SQLconsultas completas
jbmilgrom

141

Hay tres tipos básicos de unión:

  • INNERjoin compara dos tablas y solo devuelve resultados donde existe una coincidencia. Los registros de la primera tabla se duplican cuando coinciden con múltiples resultados en la segunda. Las uniones INNER tienden a hacer que los conjuntos de resultados sean más pequeños, pero como los registros pueden duplicarse, esto no está garantizado.
  • CROSSjoin compara dos tablas y devuelve todas las combinaciones posibles de filas de ambas tablas. Puede obtener muchos resultados de este tipo de unión que podrían no ser significativos, así que úselo con precaución.
  • OUTERjoin compara dos tablas y devuelve datos cuando hay una coincidencia disponible o valores NULL en caso contrario. Al igual que con INNER join, esto duplicará filas en una tabla cuando coincida con múltiples registros en la otra tabla. Las combinaciones OUTER tienden a hacer que los conjuntos de resultados sean más grandes, porque no eliminarán por sí mismos ningún registro del conjunto. También debe calificar una unión EXTERIOR para determinar cuándo y dónde agregar los valores NULL:
    • LEFT significa mantener todos los registros de la primera tabla sin importar qué e inserte valores NULL cuando la segunda tabla no coincida.
    • RIGHT significa lo contrario: mantenga todos los registros de la segunda tabla sin importar qué e inserte valores NULL cuando la primera tabla no coincida.
    • FULL significa mantener todos los registros de ambas tablas e insertar un valor NULL en cualquiera de las tablas si no hay coincidencia.

A menudo, verá la OUTERpalabra clave omitida de la sintaxis. En cambio, solo será "LEFT JOIN", "RIGHT JOIN" o "FULL JOIN". Esto se hace porque las uniones INNER y CROSS no tienen significado con respecto a IZQUIERDA, DERECHA o COMPLETA, por lo que son suficientes por sí mismas para indicar inequívocamente una unión EXTERIOR.

Aquí hay un ejemplo de cuándo es posible que desee utilizar cada tipo:

  • INNER: Desea devolver todos los registros de la tabla "Factura", junto con sus "Líneas de factura" correspondientes. Esto supone que cada factura válida tendrá al menos una línea.
  • OUTER: Desea devolver todos los registros de "InvoiceLines" para una factura particular, junto con sus registros correspondientes de "InventoryItem". Esta es una empresa que también vende servicios, de modo que no todas las líneas de factura tendrán un artículo de inventario.
  • CROSS: Tiene una tabla de dígitos con 10 filas, cada una con valores del '0' al '9'. Desea crear una tabla de rango de fechas para unirse, de modo que termine con un registro para cada día dentro del rango. Al unir CROSS esta tabla consigo mismo repetidamente, puede crear tantos enteros consecutivos como necesite (dado que comienza con 10 a 1ª potencia, cada combinación suma 1 al exponente). Luego use la función DATEADD () para agregar esos valores a su fecha base para el rango.

1
Agradable. Solo agregaría eso por lo general si solo escribe 'JOIN' significa INNER JOIN.
matpop

47

Solo hay 4 tipos:

  1. Unión interna : el tipo más común. Se genera una fila de salida para cada par de filas de entrada que coinciden en las condiciones de unión.
  2. Externa izquierda : El mismo como una combinación interna, excepto que si hay cualquier fila para la que se puede encontrar ninguna fila coincidente en la tabla de la derecha, una fila es de salida que contiene los valores de la tabla de la izquierda, con NULLpara cada valor en la tabla de la derecha. Esto significa que cada fila de la tabla de la izquierda aparecerá al menos una vez en la salida.
  3. Unión externa derecha : lo mismo que una combinación externa izquierda, excepto con los roles de las tablas invertidos.
  4. Unión externa completa : una combinación de combinaciones externas izquierda y derecha. Cada fila de ambas tablas aparecerá en la salida al menos una vez.

Una "unión cruzada" o "unión cartesiana" es simplemente una unión interna para la que no se han especificado condiciones de unión, lo que da como resultado la salida de todos los pares de filas.

Gracias a RusselH por señalar uniones COMPLETAS, que había omitido.


1
¿Qué pasa con la unión externa completa y la unión cruzada (producto cartesiano)?
SQLMenace el

full es realmente el equivalente a dos combinaciones externas
RussellH

25
COMPLETO es lo que obtienes cuando atornillas tu unión interna, y luego haces una pregunta aquí "¿por qué obtengo N ^ 2 filas en lugar de N"? Entonces todos te atraviesan.
Paul Tomblin el

24

SQL SE UNE a la diferencia:

Muy simple de recordar:

INNER JOIN solo muestra registros comunes a ambas tablas.

OUTER JOIN todo el contenido de las dos tablas se fusionan, ya sea que coincidan o no.

LEFT JOINes lo mismo que LEFT OUTER JOIN- (Seleccione los registros de la primera tabla (la más a la izquierda) con los registros de la tabla derecha coincidentes).

RIGHT JOINes igual que RIGHT OUTER JOIN- (Seleccione registros de la segunda tabla (más a la derecha) con los registros de la tabla izquierda coincidentes).

ingrese la descripción de la imagen aquí


Hay una forma correcta y relevante de etiquetar los círculos del diagrama de Venn, pero no es así. Los círculos no son las tablas de entrada. Además, las filas de resultados no son filas de entrada, por lo que su descripción es incorrecta allí. Además, esto no está claro: no explica "común a ambos", "coincidente", "combinado".
philipxy

9

Echa un vistazo a Join (SQL) en Wikipedia

  • Unión interna: dadas dos tablas, una combinación interna devuelve todas las filas que existen en ambas tablas
  • combinación izquierda / derecha (exterior): dadas dos tablas devuelve todas las filas que existen en la tabla izquierda o derecha de su combinación, además de que las filas del otro lado se devolverán cuando la cláusula de combinación coincida o se devuelva un valor nulo para esas columnas

  • Exterior completo: dadas dos tablas devuelve todas las filas y devolverá nulos cuando la columna izquierda o derecha no esté allí

  • Cross Joins: unión cartesiana y puede ser peligroso si no se usa con cuidado


6

Hacerlo más visible podría ayudar. Un ejemplo:

Tabla 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Tabla 2:

ID_BLOQUEO DE ESTUDIANTE

3               l1
4               l2
5               l3

Lo que obtengo cuando hago:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOINy RIGHT JOINson tipos de OUTER JOINs.

INNER JOIN es el valor predeterminado: las filas de ambas tablas deben coincidir con la condición de unión.


55
No puedo creer cómo esta respuesta tiene muchos votos a favor y al mismo tiempo es tan incompleta.
nbro

Creo que fue una mejor respuesta a la pregunta original.
RussellH

3

Unión interna : solo muestra filas, cuando tiene datos de ambas tablas.

Combinación externa : (izquierda / derecha) : Mostrar el resultado de todo desde la izquierda / derecha tabla con las filas emparejado ( s ), si existe o no.


2

Al principio tienes que entender lo que hace join? Conectamos varias tablas y obtenemos resultados específicos de las tablas unidas. La forma más sencilla de hacer esto es la unión cruzada .

Digamos que la tabla A tiene dos columnas A y B. Y la tabla B tiene tres columnas C y D. Si aplicamos la unión cruzada, producirá muchas filas sin sentido. Luego tenemos que hacer coincidir el uso de la clave primaria para obtener datos reales.

Izquierda: devolverá todos los registros de la tabla izquierda y el registro coincidente de la tabla derecha.

Derecha: volverá frente a la unión izquierda. Devolverá todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda.

Interior: esto es como una intersección. Solo devolverá registros coincidentes de ambas tablas.

Exterior: Y esto es como la unión. Devolverá todos los registros disponibles de ambas tablas.

Algunas veces no necesitamos todos los datos, y también deberíamos necesitar solo datos o registros comunes. podemos obtenerlo fácilmente usando estos métodos de unión. Recuerde que la unión izquierda y derecha también son uniones externas.

Puede obtener todos los registros simplemente usando cross join. Pero podría ser costoso cuando se trata de millones de registros. Por lo tanto, hágalo simple usando la unión izquierda, derecha, interna o externa.

Gracias

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.