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
Voy a utilizar el mismo ejemplo de jachguate el cual es muy claro agregando unos pequeños detalles.
Glosario
-- 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;
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 .
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.
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
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
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
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
Esto mismo, podemos verlo con diagramas de Venn:
Imagen SQL Joins.svg de Arbeck, compartida bajo licencia CC BY 3.0.
Answered by jachguate on December 5, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP