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

¿Cómo encajan también el LEFT JOIN, el RIGHT JOIN y el FULL JOIN?

Solución

Asumiendo que estás uniendo en columnas sin duplicados, lo cual es un caso muy común:

  • Una unión interna de A y B da el resultado de A intersecta B, es decir, la parte interna de una intersección diagrama de Venn.

  • Una unión externa de A y B da los resultados de A unión B, es decir, las partes externas de una unión de diagrama de Venn.

**Ejemplos

Suponga que tiene dos tablas, con una sola columna cada una, y datos como los siguientes

A    B
-    -
1    3
2    4
3    5
4    6

Observe que (1,2) son exclusivos de A, (3,4) son comunes, y (5,6) son exclusivos de B.

Unión interna

Una unión interna utilizando cualquiera de las consultas equivalentes da la intersección de las dos tablas, es decir, las dos filas que tienen en común.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Unión exterior izquierda

Una unión externa izquierda dará todas las filas en A, más cualquier fila común en B.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Unión externa derecha

Una unión externa derecha dará todas las filas en B, más cualquier fila común en A.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Una unión externa completa

Un full outer join le dará la unión de A y B, es decir, todas las filas de A y todas las filas de B. Si algo en A no tiene un dato correspondiente en B, entonces la parte de B es nula, y viceversa.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5
Comentarios (17)

Una unión interna sólo muestra filas si hay un registro coincidente en el otro lado (derecho) de la unión.

Una unión externa (izquierda) muestra filas para cada registro en el lado izquierdo, incluso si no hay filas coincidentes en el otro lado (derecho) de la unión. Si no hay ninguna fila que coincida, las columnas del otro lado (derecho) mostrarán NULLs.

Comentarios (0)

Las uniones internas requieren que exista un registro con un ID relacionado en la tabla unida.

Las uniones externas devolverán registros para el lado izquierdo incluso si no existe nada para el lado derecho.

Por ejemplo, tiene una tabla Pedidos y una tabla DetallesDelOrden. Están relacionadas por un "OrderID".

Pedidos

  • OrderID
  • Nombre del cliente

**Detalles del pedido

  • OrderDetailID
  • OrderID
  • Nombre del producto
  • Cantidad
  • Precio

La solicitud

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

sólo devolverá los pedidos que también tengan algo en la tabla OrderDetails.

Si lo cambia a OUTER LEFT JOIN

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

entonces devolverá registros de la tabla Orders aunque no tengan registros de OrderDetails.

Puede utilizar esto para encontrar pedidos que no tengan ningún OrderDetails indicando un posible pedido huérfano añadiendo una cláusula where como WHERE OrderDetails.OrderID IS NULL.

Comentarios (1)