-- 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;
FULL JOIN es una mezcla entre LEFT JOIN y RIGHT JOIN ya que se muestra ambas tablas.
En el ejemplo, ocurre lo siguiente:
SELECT E.Nombre as 'Empleado',D.Nombre as 'Departamento'
FROM Empleados E
FULL JOIN Departamentos D
ON E.DepartamentoId = D.Id
Pero todavía no esta implementado desgraciadamente en MySQL, mientras tanto podemos unir LEFT JOIN y RIGHT JOIN para obtener FULL JOIN. Por lo que una manera similar de realizarlo seria de la siguiente forma :
SELECT E.Nombre as 'Empleado',
D.Nombre as 'Departamento'
FROM Empleados E
LEFT JOIN Departamentos D
ON E.DepartamentoId = D.Id
UNION
SELECT E.Nombre as 'Empleado',
D.Nombre as 'Departamento'
FROM Empleados E
RIGHT JOIN Departamentos D
ON E.DepartamentoId = D.Id;
Se muestra el empleado "Williams" a pesar que no está asignado a ningún departamento, y se muestra el departamento de "Marketing" a pesar que aún nadie está trabajando allí :
假设您正在执行
join
没有重复的列检查,这是一种常见情况:A 和 B的内连接将返回集合 A 和 B 的交集的结果。换句话说,维恩图中的内部部分 - 交集。
A和 B 之间的完全外连接将返回 A 和 B 并集的结果。换句话说,维恩图中的外部分 - 连接 -。
例子:
假设我们有两个表,每个表都有一个列和以下数据:
请注意,(1,2) 仅在 A 中找到,(3,4) 很常见,(5,6) 仅在 B 中找到。
内部联接
内连接(使用任何等效查询语法)为您提供两个表的交集,即两个表共有的行。
左外连接
左边的A
outer join
将为您提供 A 的所有行,包括 A 和 B 之间的公共行。右外连接
右边的 A
outer join
将为您提供 B 的所有行,包括与 A 共同的行。全外连接
一个
outer join
完整的(完整的)会给你A和B的结合;即A中的所有行和B中的所有行。如果A中的行在B中没有对应的行,则B的部分为空,反之亦然。维恩图
我们可以用维恩图看到同样的事情:
Arbeck的SQL Joins.svg图像 ,在CC BY 3.0 许可下共享。
我将使用相同的 jachguate 示例,它非常清楚地添加了一些小细节。
词汇表
手表:
我的详细解释:
Ejecutar
INNER JOIN 子句
该子句搜索两个表之间的匹配,它类似于过去使用的主键表联合,例如
SELECT * FROM Departamentos, Empleados WHERE Departamentos.Id=Empleados.DepartamentosId;
例如:如果我想列出员工并指明他们所属部门的名称,我们可以执行以下操作:
Ejecutar
结果将是:
从这里我们意识到以下几点:
员工“Williams”没有出现在结果中,因为他不属于当前存在的任何部门。
“营销”部门也不会出现,因为没有员工属于该部门。
为什么会这样?因为它显示了两个表的交集。
请记住,在结果中我们看到 4 列。前 2 个对应于雇员表,最后一个对应于部门。
发生这种情况是因为我们选择了所有带有星号 (*) 的列。
如果需要,我们可以具体并仅选择 2 列:
并得到:
Ejecutar
左连接子句
与带有 LEFT JOIN 的 INNER JOIN 不同,我们优先考虑左表,并搜索右表。
如果左表中的任何行都不匹配,则无论如何都会显示第一个表中的所有结果。
一个例子:
Employees 表是第一个出现在查询中的表(在 FROM 中),所以这是 LEFT 表,它的所有行都将显示在结果中。
Departments 表是右侧的表(它出现在 LEFT JOIN 之后)。因此,如果找到匹配项,则会显示相应的值,否则结果中将显示 NULL。
Ejecutar
右连接条款
在 RIGHT JOIN 的情况下,它非常相似,但这里右边的表是优先的。
因此,如果我使用以下查询,我们将显示右侧表中的所有行:
Ejecutar
La tabla de la izquierda es Empleados, mientras que Departamentos es la tabla de la derecha.
La tabla asociada al FROM será siempre la tabla LEFT, y la tabla que viene después del JOIN será la tabla RIGHT.
Entonces el resultado mostrará todos los departamentos al menos 1 vez.
Si no hay ningún empleado trabajando en un departamento, se mostrará NULL. Pero el departamento aparecerá de todo modos.
Cláusula FULL JOIN
FULL JOIN es una mezcla entre LEFT JOIN y RIGHT JOIN ya que se muestra ambas tablas.
En el ejemplo, ocurre lo siguiente:
Pero todavía no esta implementado desgraciadamente en MySQL, mientras tanto podemos unir LEFT JOIN y RIGHT JOIN para obtener FULL JOIN. Por lo que una manera similar de realizarlo seria de la siguiente forma :
Se muestra el empleado "Williams" a pesar que no está asignado a ningún departamento, y se muestra el departamento de "Marketing" a pesar que aún nadie está trabajando allí :
Ejecutar
Más variantes
Si prestamos atención a los diagramas de Venn, vamos a notar que es posible formar incluso más combinaciones, al momento de seleccionar datos.
Por ejemplo, tenemos el siguiente caso, conocido como Left Excluding JOIN:
Y de igual manera Right Excluding JOIN:
Estas combinaciones son posibles de lograr si añadimos algunas condiciones a nuestras consultas, haciendo uso de la cláusula WHERE.
Por ejemplo, siguiendo el ejemplo que estamos viendo (donde Empleados es la tabla izquierda y Departamentos la tabla derecha):
Left Excluding JOIN nos permitirá obtener la lista de empleados que aún no han sido asignados a ningún departamento de trabajo.
而 Right Excluding JOIN 将向我们显示没有任何关联工作人员的部门列表。
信息取自: https ://programacionymas.com/blog/como-carga-inner-left-right-full-join