TransWikia.com

¿Cuál es la diferencia entre un inner y un outer join?

Stack Overflow en español Asked by jachguate on December 5, 2021

¿Cuál es la diferencia entre un inner y un outer join?

Y ¿cuál es la función de los modificadores?

  • left
  • right
  • full

2 Answers

Voy a utilizar el mismo ejemplo de jachguate el cual es muy claro agregando unos pequeños detalles.

Glosario

  • inner join (traducción libre: Unión interna)
  • outer join (traducción libre: Unión externa)

introducir la descripción de la imagen aquí

-- Crear tabla A (tabla Izquierda)
CREATE TABLE A
(
a INT
);

-- Crear tabla B (tabla derecha)
CREATE TABLE B
(
b INT
);

-- Insertar datos
Insert into A (a) Values (1);
Insert into A (a) Values (2);
Insert into A (a) Values (3);
Insert into A (a) Values (4);
Insert into B (b) Values (3);
Insert into B (b) Values (4);
Insert into B (b) Values (5);
Insert into B (b) Values (6);
COMMIT;

-- Tabla A
SELECT * FROM A;

-- Tabla B
SELECT * FROM B;

/* Inner Join. */
-- Unión interna, filas que ambas tablas 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;

/* Left outer join */
-- Unión externa por la izquierda, todas las filas de A (tabla izquierda) relacionadas con B, así estas tengan o no coincidencias.
select * from A LEFT OUTER JOIN B on A.a = B.b;
select A.*,B.*  from A,B where A.a = B.b(+);

/* Right outer join */
-- Unión externa por la derecha, todas las filas de B (tabla derecha), así estas tengan o no coincidencias con A.
select * from A RIGHT OUTER JOIN B on A.a = B.b;
select A.*,B.*  from A,B where A.a(+) = B.b;

/* Full outer join */
-- Unión externa completa, unión externa por la izquierda unida a unión externa por la derecha. 

-- En oracle:
select * from A FULL OUTER JOIN B on A.a = B.b;

-- En MySql no está implementado FULL OUTER JOIN, para obtener este mismo resultado:

select * from A LEFT OUTER JOIN B on A.a = B.b
UNION 
select * from A RIGHT OUTER JOIN B on A.a = B.b;

introducir la descripción de la imagen aquí

Ver:

Answered by Goerman on December 5, 2021

Asumiendo que se está haciendo un join de columnas sin duplicados, lo cuál es un caso común:

  • Un inner join de A y B entregará el resultado de la intersección de los conjuntos A y B. En otras palabras, la parte interna –intersección– en un diagrama de Venn.

  • Un full outer join entre A y B entregará el resultado de la unión de A y B. En otras palabras, la parte externa –unión– en un diagrama de Venn .

Ejemplos:

Supongamos que tenemos dos tablas, con una sola columna cada una y los siguientes datos:

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

Nota que (1,2) solo se encuentran en A, (3,4) son comunes y (5,6) solamente se encuentran en B.

Inner Join

Un inner join –utilizando cualquiera de las sintaxis de consulta equivalente– te entrega la intersección de ambas tablas, es decir, las filas que ambas tablas 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

Left outer join

Un outer join por la izquierda, te dará todas las filas de A, incluyendo las filas comunes entre A y 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

Right outer join

Un outer join por la derecha te dará todas las filas de B, incluyendo las filas comunes con 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

Full outer join

Un outer join completo (full) te entregará la unión de A y B; es decir, todas las filas de A y todas las filas de B. Si una fila en A no tiene una fila correspondiente en B, la porción de B es null, y vice versa.

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

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

Diagramas de Venn

Esto mismo, podemos verlo con diagramas de Venn:

Explicación visual de joins Imagen SQL Joins.svg de Arbeck, compartida bajo licencia CC BY 3.0.

Answered by jachguate on December 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP