¿Cuál es la diferencia entre un INNER JOIN y un OUTER JOIN?


35

Soy nuevo en SQL y quería saber cuál es la diferencia entre esos dos JOINtipos.

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

¿Cuándo debo usar uno u otro?


66
¿encaja esto como una pregunta de DBA? Esto me parece más una pregunta de codificación.
BlackICE el

1
@David tus pensamientos sobre Meta
Sathyajith Bhat

@David y luego VtC si crees que está mal para el sitio. Siempre podemos reabrir.
jcolebrand

3
Creo que esta es una gran pregunta, y muy apropiada para el sitio.
datagod

esto debe ser sacado del DBA a menos que un DBA novato se enfunda para ajustar el rendimiento del DB: P
AmDB

Respuestas:


32
  • Una combinación interna solo seleccionará registros donde las claves unidas estén en ambas tablas especificadas.
  • Una combinación externa izquierda seleccionará todos los registros de la primera tabla y cualquier registro de la segunda tabla que coincida con las teclas unidas.
  • Una combinación externa derecha seleccionará todos los registros de la segunda tabla y cualquier registro de la primera tabla que coincida con las teclas unidas.

En su primer ejemplo, solo devolverá una lista de usuarios y números de teléfono si existe al menos un registro telefónico para el usuario.

En su segundo ejemplo, devolverá una lista de todos los usuarios, más todos los registros telefónicos si están disponibles (si no están disponibles, obtendrá NULLlos valores del teléfono).


13

Cada vez que alguien hace esta pregunta, hay una respuesta: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

Espero que te ayude a entender,


3
He trabajado con combinaciones durante 20 años y esos diagramas me parecieron confusos.
Hogan

3
Estoy con @Hogan: los diagramas de ven no son la mejor explicación para esto ... una cuadrícula que muestre qué combinaciones se devolverían probablemente sería mejor.
Joe

Todo lo que muestra es que no entiendes un diagrama de Venn. Se relacionan perfectamente con los tipos de unión, pero tengan en cuenta que son una herramienta para ayudar a comprender a los nuevos en las uniones. Si ya aprendió a unirse con un concepto diferente en mente, seguramente no le resultará familiar. Eso no es problema, pero tampoco es un buen indicador de la utilidad de los diagramas.
JamesRyan

@jamesryan eso no es cierto, no se relacionan perfectamente, las uniones son similares al producto cartesiano de conjuntos, no a la intersección y la unión, el análogo del diagrama de Venn solo funciona si se une sobre claves únicas, si tiene claves duplicadas, entonces pierde El aspecto cartesiano del producto.
Será

1
Estoy totalmente en desacuerdo, los diagramas de Venn ya tienen una interpretación muy bien definida, establecen intersección y unión. Las uniones no se ajustan a esta interpretación cuando se une sobre claves no únicas. Creo que interpretas los diagramas de Venn demasiado ampliamente.
Será el

8

Una combinación interna devuelve filas que se pueden combinar según los criterios de combinación.
Una combinación externa devuelve estas y todas las filas ...
   ... de la primera tabla para una combinación izquierda
   ... de la segunda tabla para una combinación derecha
   ... de ambas tablas para una combinación completa

Elegir cuándo usar uno u otro es una cuestión de determinar qué datos necesita. Para su ejemplo, si solo necesita registros que tengan ID de usuario del teléfono que coincidan con los ID del usuario, utilice la combinación interna. Si también desea incluir filas del usuario que no tienen una entrada telefónica coincidente, entonces la combinación izquierda sería apropiada.

Para obtener más información, consulte esta pregunta en StackOverflow .


7

Si tiene 2 tablas como a continuación:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

Si usas Inner Join obtienes:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

Si usa Full Outer Join obtendrá:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

Si usa Left Outer Join obtendrá:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL

6

La unión externa está expresamente diseñada para producir nulos en su resultado y, por lo tanto, debe evitarse, en general. Relacionalmente hablando, es una especie de matrimonio de escopeta: obliga a las mesas a una especie de unión, sí, quiero decir unión, no unión, incluso cuando las mesas en cuestión no cumplen con los requisitos habituales para la unión. Lo hace, en efecto, rellenando una o ambas tablas con valores nulos antes de hacer la unión, haciéndolas cumplir con los requisitos habituales después de todo. Pero no hay ninguna razón por la cual ese relleno no se debe hacer con valores adecuados en lugar de nulos, como en este ejemplo:

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

Alternativamente, se podría obtener el mismo resultado utilizando el operador de combinación externa SQL junto con COALESCE, como aquí:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

Una observación sobre la unión externa (4.6) en "SQL y teoría relacional: cómo escribir un código SQL preciso" por fecha CJ


5

Una combinación interna es una combinación en la que los únicos resultados que se muestran son resultados en los que las claves están en ambas tablas. Una combinación externa mostrará los resultados para todas las claves en una tabla, una combinación izquierda desde la primera y una combinación derecha desde la segunda. Por ejemplo:

Digamos que la tabla 1 tiene los siguientes pares de datos y clave primaria: (1, a), (2, b), (3, c)

Supongamos también que table2 tiene los siguientes pares de claves principales y datos: (1, diversión), (3, can), (4, pasar)

Por lo tanto, una unión interna de table1 a table2 en las claves primarias produciría los siguientes tripletes resultantes (con la clave primaria común primero, el segundo elemento de la primera tabla segundo y el segundo elemento de la segunda tabla tercero): (1, a, diversión), ( 3, c, lata)

Una combinación externa izquierda de table1 a table2 en las claves primarias produciría los siguientes tripletes resultantes (el mismo formato que el anterior): (1, a, fun), (2, b, NULL), (3, c, can)

Una unión externa derecha de table1 a table2 en las claves primarias produciría los siguientes tripletes resultantes (el mismo formato que el anterior): (1, a, fun), (3, c, can), (4, NULL, suceder)

Espero que esto explique el concepto decentemente bien.


4

Déjame intentar describirlo un poco más intuitivo.

La unión interna muestra a los usuarios, que tienen uno o más teléfonos junto con sus números de teléfono.

La combinación externa izquierda enumera adicionalmente aquellos 'usuarios' que no tienen teléfono.


4

Como ha preguntado cuándo usar qué, aquí hay un escenario con consultas: seleccione cuál usar según el requisito.

Datos:

Los usuarios de la tabla tienen 10 registros. La tabla Phoneno tiene 6 registros (con una relación 1: 1, lo que significa que una entrada en PhoneNo hará referencia solo a una entrada en Usuarios, y solo una entrada en PhoneNo puede hacer referencia a una entrada dada en Usuarios).

Requisito 1: Mostrar a todos los usuarios con sus números de teléfono. Ignorar usuarios sin número de teléfono.

Consulta:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

Resultado: muestra 6 usuarios que tienen número de teléfono

Requisito 2: Mostrar a todos los usuarios con su número de teléfono. Si el usuario no tiene una pantalla de teléfono 'N / A' (no disponible)

Consulta:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

Resultado:

Muestra los 10 registros

Nota: ifnull es una sintaxis de MySql para transformar el valor nulo. Utilicé esta función para hacer que el motor de db muestre 'N / A' cuando phonno es nulo. Busque la función adecuada si está utilizando algún otro DBMS. En SQL Server tienes que usar la CASEdeclaración.

Espero que esto ayude.

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.