¿Cuál es la diferencia entre “UNIÓN INTERIOR” y “UNIÓN EXTERIOR”?
-
09-06-2019 - |
Pregunta
También ¿cómo LEFT JOIN
, RIGHT JOIN
y FULL JOIN
encajar?
Solución
Suponiendo que se une a columnas sin duplicados, que es un caso muy común:
Una unión interna de A y B da el resultado de que A cruza a B, es decir,la parte interior de un diagrama de Venn intersección.
Una unión externa de A y B da los resultados de A unión B, es decirlas partes exteriores de una unión del diagrama de Venn.
Ejemplos
Supongamos que tiene dos tablas, con una sola columna cada una, y los datos son los siguientes:
A B
- -
1 3
2 4
3 5
4 6
Tenga en cuenta que (1,2) son exclusivos de A, (3,4) son comunes y (5,6) son exclusivos de B.
Unir internamente
Una combinación interna que utiliza cualquiera de las consultas equivalentes proporciona la intersección de las dos tablas, es decirlas 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
Izquierda combinación externa
Una unión exterior izquierda dará todas las filas de A, más las filas comunes de 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 exterior derecha
Una unión exterior derecha dará todas las filas de B, más las filas comunes de 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
Unión exterior completa
Una unión externa completa le dará la unión de A y B, es decirtodas las filas de A y todas las filas de B.Si algo en A no tiene un dato correspondiente en B, entonces la porción 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
Otros consejos
Los diagramas de Venn realmente no me sirven.
No muestran ninguna distinción entre una unión cruzada y una unión interna, por ejemplo, ni, de manera más general, muestran ninguna distinción entre diferentes tipos de predicados de unión ni proporcionan un marco para razonar sobre cómo operarán.
No existe sustituto para la comprensión del procesamiento lógico y, de todos modos, es relativamente sencillo de comprender.
- Imagine una unión cruzada.
- Evalúa el
on
cláusula contra todas las filas del paso 1 manteniendo aquellas donde el predicado se evalúa comotrue
- (Solo para uniones exteriores) vuelva a agregar las filas exteriores que se perdieron en el paso 2.
(NÓTESE BIEN:En la práctica, el optimizador de consultas puede encontrar formas más eficientes de ejecutar la consulta que la descripción puramente lógica anterior, pero el resultado final debe ser el mismo).
Comenzaré con una versión animada de un unión externa completa.A continuación se explica más detalladamente.
Explicación
Tablas fuente
Primero comience con un CROSS JOIN
(También conocido como producto cartesiano).Esto no tiene un ON
cláusula y simplemente devuelve cada combinación de filas de las dos tablas.
SELECCIONE A.Color, B.Color DE UNA UNIÓN CRUZADA B
Las uniones internas y externas tienen un predicado de cláusula "ON".
- Unir internamente. Evalúe la condición en la cláusula "ON" para todas las filas en el resultado de la unión cruzada.Si es verdadero, devuelve la fila unida.De lo contrario, deséchelo.
- Izquierda combinación externa. Lo mismo que la unión interna, para cualquier fila de la tabla de la izquierda que no coincida con nada, genere valores NULL para las columnas de la tabla de la derecha.
- Unión exterior derecha. Lo mismo que la combinación interna, para cualquier fila de la tabla derecha que no coincida con nada, genere valores NULL para las columnas de la tabla izquierda.
- Unión externa completa. Igual que la unión interna, luego conserve las filas izquierdas no coincidentes como en la unión externa izquierda y las filas derechas no coincidentes según la unión externa derecha.
Algunos ejemplos
SELECCIONE A.Color, B.Color DESDE UNA UNIÓN INTERNA B EN A.Color = B.Color
Lo anterior es el clásico equi join.
Versión animada
SELECCIONE A.Color, B.Color DE UNA UNIÓN INTERNA B EN A.Color NO EN ('Verde','Azul')
La condición de unión interna no tiene por qué ser necesariamente una condición de igualdad y no necesita hacer referencia a columnas de ambas (o incluso de cualquiera) de las tablas.evaluando A.Colour NOT IN ('Green','Blue')
en cada fila de los retornos de unión cruzada.
SELECCIONE A.Color, B.Color DESDE UNA UNIÓN INTERNA B EN 1 =1
La condición de unión se evalúa como verdadera para todas las filas en el resultado de la unión cruzada, por lo que es lo mismo que una unión cruzada.No volveré a repetir la imagen de las 16 filas.
SELECCIONE A.Color, B.Color DESDE UNA UNIÓN EXTERIOR IZQUIERDA B EN A.Color = B.Color
Las uniones externas se evalúan lógicamente de la misma manera que las uniones internas, excepto que si una fila de la tabla de la izquierda (para una unión izquierda) no se une con ninguna fila de la tabla de la derecha, se conserva en el resultado con NULL
valores para las columnas de la derecha.
SELECCIONE A.Color, B.Color DESDE UNA UNIÓN EXTERIOR IZQUIERDA B EN A.Color = B.Color DONDE B.Color ES NULO
Esto simplemente restringe el resultado anterior para devolver solo las filas donde B.Colour IS NULL
.En este caso particular, estas serán las filas que se conservaron porque no coincidían en la tabla de la derecha y la consulta devuelve la única fila roja que no coincide en la tabla. B
.Esto se conoce como anti semi unión.
Es importante seleccionar una columna para el IS NULL
prueba que no es anulable o para la cual la condición de unión garantiza que cualquier NULL
Los valores se excluirán para que este patrón funcione correctamente y evitar simplemente recuperar filas que tengan un NULL
valor para esa columna además de las filas no coincidentes.
SELECCIONE A.Color, B.Color DESDE UNA UNIÓN EXTERIOR DERECHA B EN A.Color = B.Color
Las uniones externas derechas actúan de manera similar a las uniones externas izquierdas, excepto que conservan las filas que no coinciden de la tabla derecha y extienden las columnas de la izquierda.
SELECCIONE A.Color, B.Color DE UNA UNIÓN EXTERIOR COMPLETA B EN A.Color = B.Color
Las uniones externas completas combinan el comportamiento de las uniones izquierda y derecha y conservan las filas que no coinciden de las tablas izquierda y derecha.
SELECCIONE A.Color, B.Color DE UNA UNIÓN EXTERIOR COMPLETA B EN 1 = 0
Ninguna fila en la unión cruzada coincide con el 1=0
predicado.Todas las filas de ambos lados se conservan utilizando reglas de unión externa normales con NULL en las columnas de la tabla del otro lado.
SELECCIONE UNIRSE (A.Color, B.Color) COMO Color DESDE UNA UNIÓN EXTERNA COMPLETA B EN 1 = 0
Con una pequeña modificación de la consulta anterior se podría simular una UNION ALL
de las dos mesas.
SELECCIONE A.Color, B.Color DESDE UNA UNIÓN EXTERIOR IZQUIERDA B EN A.Color = B.Color DONDE B.Color = 'Verde'
Tenga en cuenta que el WHERE
La cláusula (si está presente) se ejecuta lógicamente después de la unión.Un error común es realizar una unión externa izquierda y luego incluir una cláusula WHERE con una condición en la tabla derecha que termina excluyendo las filas que no coinciden.Lo anterior termina realizando la unión exterior...
...Y luego se ejecuta la cláusula "Dónde". NULL= 'Green'
no se evalúa como verdadero, por lo que la fila preservada por la unión externa termina descartada (junto con la azul), convirtiendo efectivamente la unión nuevamente en una interna.
Si la intención fuera incluir solo filas de B donde el color es verde y todas las filas de A independientemente, la sintaxis correcta sería
SELECCIONE A.Color, B.Color DESDE UNA UNIÓN EXTERIOR IZQUIERDA B EN A.Color = B.Color Y B.Color = 'Verde'
Violín SQL
Vea estos ejemplos ejecutar en vivo en SQLFiddle.com.
Uniones se utilizan para combinar los datos de dos tablas, con el resultado de una nueva tabla temporal.Las uniones se realizan en función de algo llamado predicado, que especifica la condición a utilizar para realizar una unión.La diferencia entre una combinación interna y una combinación externa es que una combinación interna devolverá solo las filas que realmente coinciden según el predicado de la combinación.Consideremos la tabla de empleados y ubicación:
Unir internamente:-La combinación interna crea una nueva tabla de resultados combinando valores de columna de dos tablas (Empleado y Ubicación) basado en el predicado de unión.La consulta compara cada fila de Empleado con cada fila de Ubicación para encontrar todos los pares de filas que satisfacen el predicado de unión.Cuando el predicado de unión se satisface al hacer coincidir valores no NULL, los valores de columna para cada par de filas coincidentes de Empleado y Ubicación se combinan en una fila de resultados.Así es como se verá el SQL para una unión interna:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
Ahora, así es como se vería el resultado de ejecutar ese SQL:
Unión externa: -Una combinación externa no requiere que cada registro de las dos tablas unidas tenga un registro coincidente.La tabla unida conserva cada registro, incluso si no existe ningún otro registro coincidente.Las uniones externas se subdividen en uniones externas izquierdas y uniones externas derechas, según las filas de la tabla que se conserven (izquierda o derecha).
Izquierda combinación externa:-El resultado de una unión externa izquierda (o simplemente unión izquierda) para tablas Empleado y Ubicación siempre contiene todos los registros de la tabla "izquierda" (Empleado), incluso si la condición de unión no encuentra ningún registro coincidente en la tabla "correcta" (Ubicación).Así es como se vería el SQL para una unión externa izquierda, usando las tablas anteriores:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Ahora, así es como se vería el resultado de ejecutar este SQL:
Unión exterior derecha: -Una combinación exterior derecha (o combinación derecha) se parece mucho a una combinación exterior izquierda, excepto que el tratamiento de las tablas se invierte.Cada fila de la tabla "derecha" (Ubicación) aparecerá en la tabla unida al menos una vez.Si no hay ninguna fila coincidente de la tabla "izquierda" (Empleado) existe, NULL aparecerá en las columnas de Empleado para aquellos registros que no tienen coincidencia en Ubicación.Así es como se ve el SQL:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Usando las tablas anteriores, podemos mostrar cómo se vería el conjunto de resultados de una unión externa derecha:
Uniones exteriores completas: -La unión externa completa o unión completa consiste en retener la información que no coincide al incluir filas que no coinciden en los resultados de una unión; utilice una unión externa completa.Incluye todas las filas de ambas tablas, independientemente de si la otra tabla tiene un valor coincidente o no.
Unir internamente
Recuperar solo las filas coincidentes, es decir, A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Izquierda combinación externa
Seleccione todos los registros de la primera tabla y cualquier registro en la segunda tabla que coincida con las teclas unidas.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Unión externa completa
Seleccione todos los registros de la segunda tabla, y cualquier registro en la primera tabla que coincida con las teclas unidas.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Referencias
En palabras simples:
Un unir internamente recuperar solo las filas coincidentes.
Mientras que un unión externa recupere las filas coincidentes de una tabla y todas las filas de otra tabla... el resultado depende de cuál esté utilizando:
Izquierda:Filas coincidentes en la tabla de la derecha y todas las filas de la tabla de la izquierda
Bien:Filas coincidentes en la tabla de la izquierda y todas las filas en la tabla de la derecha o
Lleno:Todas las filas en todas las tablas.No importa si hay coincidencia o no.
Una combinación interna solo muestra filas si hay un registro coincidente en el otro lado (derecho) de la combinación.
Una combinació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 combinación.Si no hay ninguna fila coincidente, las columnas del otro lado (derecho) mostrarán valores NULL.
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 Orders y OrderDetails.Están relacionados por un "OrderID".
Pedidos
- Solicitar ID
- Nombre del cliente
Detalles del pedido
- ID de detalle del pedido
- Solicitar ID
- Nombre del producto
- Cantidad
- Precio
La solicitud
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
solo devolverá Órdenes que también tengan algo en la tabla Detalles del pedido.
Si lo cambia a UNIÓN IZQUIERDA EXTERIOR
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
luego devolverá registros de la tabla Pedidos incluso si no tienen registros OrderDetails.
Puede usar esto para buscar pedidos que no tengan ningún detalle de pedido que indique un posible pedido huérfano agregando una cláusula donde como WHERE OrderDetails.OrderID IS NULL
.
En palabras simples:
Unir internamente -> Tome SÓLO registros comunes de las tablas principal y secundaria DONDE la clave principal de la tabla principal coincida con la clave externa en la tabla secundaria.
unirse a la izquierda ->
pseudocódigo
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
Unirse a la derecha :Exactamente lo contrario de la unión izquierda.Coloque el nombre de la tabla en LEFT JOIN en el lado derecho en Right join, obtendrá el mismo resultado que LEFT JOIN.
unión externa :Mostrar todos los registros en ambas tablas No matter what
.Si los registros de la tabla de la izquierda no coinciden con los de la tabla de la derecha según la clave primaria externa, utilice el valor NULL como resultado de la unión.
Ejemplo :
Supongamos ahora para 2 mesas.
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
Aquí, la tabla de empleados es la tabla maestra, phone_numbers_employees es la tabla secundaria (contiene emp_id
como clave externa que conecta employee.id
entonces es la tabla secundaria.)
Uniones internas
Tome los registros de 2 tablas. SÓLO SI la clave principal de la tabla de empleados (su id) coincide con la clave externa de la tabla secundaria phone_numbers_employees (emp_id).
Entonces la consulta sería:
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Aquí solo se toman las filas coincidentes en la clave principal = clave externa como se explicó anteriormente. Aquí las filas que no coinciden en la clave principal = clave externa se omiten como resultado de la unión.
Se une a la izquierda :
La unión izquierda conserva todas las filas de la tabla izquierda, independientemente de si hay una fila que coincida en la tabla derecha.
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Uniones exteriores :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Diagramáticamente se ve así:
Tu usas INNER JOIN
para devolver todas las filas de ambas tablas donde hay una coincidencia.es decir.En la tabla resultante, todas las filas y columnas tendrán valores.
En OUTER JOIN
la tabla resultante puede tener columnas vacías.La unión externa puede ser LEFT
o RIGHT
.
LEFT OUTER JOIN
devuelve todas las filas de la primera tabla, incluso si no hay coincidencias en la segunda tabla.
RIGHT OUTER JOIN
devuelve todas las filas de la segunda tabla, incluso si no hay coincidencias en la primera tabla.
Esta es una buena explicación esquemática para todo tipo de uniones.
fuente: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
INNER JOIN
requiere que haya al menos una coincidencia al comparar las dos tablas.Por ejemplo, la tabla A y la tabla B que implica A ٨ B (A intersección B).
LEFT OUTER JOIN
y LEFT JOIN
son lo mismo.Proporciona todos los registros que coinciden en ambas tablas y todas las posibilidades de la tabla de la izquierda.
Similarmente, RIGHT OUTER JOIN
y RIGHT JOIN
son lo mismo.Proporciona todos los registros que coinciden en ambas tablas y todas las posibilidades de la tabla correcta.
FULL JOIN
es la combinación de LEFT OUTER JOIN
y RIGHT OUTER JOIN
sin duplicación.
La respuesta está en el significado de cada uno, por lo tanto en los resultados.
Nota :
EnSQLite
no hayRIGHT OUTER JOIN
oFULL OUTER JOIN
.
Y también enMySQL
no hayFULL OUTER JOIN
.
Mi respuesta se basa en lo anterior. Nota.
Cuando tienes dos tablas como estas:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
UNIÓN CRUZADA / UNIÓN EXTERIOR:
Puedes tener todos esos datos de tablas con CROSS JOIN
o simplemente con ,
como esto:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
UNIR INTERNAMENTE :
Cuando desee agregar un filtro a los resultados anteriores en función de una relación como table1.id = table2.id
puedes usar INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
IZQUIERDA COMBINACIÓN EXTERNA :
Cuando desee tener todas las filas de una de las tablas en el resultado anterior, con la misma relación, puede usar LEFT JOIN
:
(Para ÚNETE DERECHO solo cambia el lugar de las mesas)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
UNIÓN EXTERIOR COMPLETA:
Cuando también desee tener todas las filas de la otra tabla en sus resultados, puede usar FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
Pues según tu necesidad eliges cada uno que cubra tu necesidad ;).
Unir internamente.
Una combinación consiste en combinar las filas de dos tablas.Un unir internamente intenta hacer coincidir las dos tablas según los criterios que especifique en la consulta y solo devuelve las filas que coinciden.Si una fila de la primera tabla de la combinación coincide con dos filas de la segunda tabla, se devolverán dos filas en los resultados.Si hay una fila en la primera tabla que no coincide con una fila en la segunda, no se devuelve;Del mismo modo, si hay una fila en la segunda tabla que no coincide con una fila de la primera, no se devuelve.
Unión exterior.
A unirse a la izquierda intenta encontrar coincidencias entre las filas de la primera tabla y las filas de la segunda tabla.Si no puede encontrar una coincidencia, devolverá las columnas de la primera tabla y dejará las columnas de la segunda tabla en blanco (nula).
No veo muchos detalles sobre el rendimiento y el optimizador en las otras respuestas.
A veces es bueno saber que sólo INNER JOIN
es asociativo, lo que significa que el optimizador tiene más opciones para jugar con él.Puede reordenar el orden de unión para hacerlo más rápido manteniendo el mismo resultado.El optimizador puede utilizar la mayoría de los modos de unión.
Generalmente es una buena práctica intentar utilizar INNER JOIN
en lugar de los diferentes tipos de uniones.(Por supuesto, si es posible considerando el conjunto de resultados esperado).
Aquí hay un par de buenos ejemplos y explicaciones sobre este extraño comportamiento asociativo:
El algoritmo preciso para INNER JOIN
, LEFT/RIGHT OUTER JOIN
son los siguientes:
- Tome cada fila de la primera tabla:
a
- Considere todas las filas de la segunda tabla al lado:
(a, b[i])
- Evalúa el
ON ...
cláusula contra cada par:ON( a, b[i] ) = true/false?
- Cuando la condición se evalúa como
true
, devuelve esa fila combinada(a, b[i])
. - Cuando llegue al final de la segunda mesa sin ningún partido, y este es un
Outer Join
luego devolver un (virtual) emparejar usandoNull
para todas las columnas de otra tabla:(a, Null)
para unión exterior IZQUIERDA o(Null, b)
para unión exterior DERECHA.Esto es para garantizar que todas las filas de la primera tabla existan en los resultados finales.
- Cuando la condición se evalúa como
Nota: la condición especificada en ON
La cláusula puede ser cualquier cosa, no es necesario utilizarla. Claves primarias (¡y no es necesario que siempre consultes las columnas de ambas tablas)!Por ejemplo:
... ON T1.title = T2.title AND T1.version < T2.version
( => vea esta publicación como un ejemplo de uso: Seleccione solo filas con valor máximo en una columna)... ON T1.y IS NULL
... ON 1 = 0
(solo como muestra)
Nota: Unión izquierda = Unión exterior izquierda, Unión derecha = Unión exterior derecha.
Habiendo criticado el muy querido diagrama de Venn sombreado en rojo, pensé que era justo publicar mi propio intento.
Aunque la respuesta de @Martin Smith es, con diferencia, la mejor de este grupo, solo muestra la columna clave de cada tabla, mientras que creo que lo ideal sería que también se mostraran las columnas que no son clave.
Lo mejor que pude hacer en la media hora permitida, todavía no creo que muestre adecuadamente que los valores nulos están ahí debido a la ausencia de valores clave en TableB
o eso OUTER JOIN
es en realidad una unión en lugar de una unión:
INNER JOIN
unión más típica para dos o más tablas.Devuelve una coincidencia de datos tanto en la tabla ON de la clave primaria como en la relación de clave externa.OUTER JOIN
es igual queINNER JOIN
, pero también incluyeNULL
datos en ResultSet.LEFT JOIN
=INNER JOIN
+ Datos inigualables de izquierda mesa conNull
coincidencia en la mesa de la derecha.RIGHT JOIN
=INNER JOIN
+ Datos inigualables de bien mesa conNull
partido en la mesa de la izquierda.FULL JOIN
=INNER JOIN
+ Datos inigualables sobre tanto derecha como izquierda mesas conNull
partidos.
- La unión automática no es una palabra clave en SQL; cuando una tabla hace referencia a datos en sí misma, se conoce como unión automática.Usando
INNER JOIN
yOUTER JOIN
Podemos escribir consultas de autounión.
Por ejemplo:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
Definiciones más simples
Unir internamente:Devoluciones registros coincidentes de ambas tablas.
Unión externa completa:Devoluciones igualadas y registros inigualables de ambas tablas con nulo para registros no coincidentes de Ambas tablas.
Izquierda combinación externa:Devuelve registros coincidentes y no coincidentes sólo de la tabla del Lado izquierdo.
Unión exterior derecha:Devuelve registros coincidentes y no coincidentes sólo de la tabla del Lado derecho.
En breve
Coincidente + Izquierda No coincidente + Derecha No coincidente = Unión externa completa
Emparejado + Izquierdo Sin emparejar = Izquierda combinación externa
Coincidente + Correcto Sin igual = Unión exterior derecha
Emparejado = Unir internamente
En lenguaje sencillo,
1.UNIÓN INTERNA O UNIÓN EQUI: Devuelve el conjunto de resultados que coincide solo con la condición en ambas tablas.
2.UNIÓN EXTERNA: Devuelve el conjunto de resultados de todos los valores de ambas tablas, incluso si la condición coincide o no.
3.ÚNETE A LA IZQUIERDA: Devuelve el conjunto de resultados de todos los valores de la tabla de la izquierda y solo las filas que coinciden con la condición de la tabla de la derecha.
4.ÚNETE DERECHO: Devuelve el conjunto de resultados de todos los valores de la tabla de la derecha y solo las filas que coinciden con la condición de la tabla de la izquierda.
5.ÚNETE COMPLETO: La unión completa y la unión exterior completa son iguales.
1.Unir internamente: También llamado Unirse.Devuelve las filas presentes tanto en la tabla izquierda como en la tabla derecha únicamente. si hay una coincidencia.De lo contrario, devuelve cero registros.
Ejemplo:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2.Unión externa completa: También llamado Unión Completa.Vuelve todas las filas presente tanto en la tabla izquierda como en la tabla derecha.
Ejemplo:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3.Izquierda combinación externa: O simplemente llamado Unión Izquierda.Devuelve todas las filas presentes en la tabla izquierda y las filas coincidentes de la tabla derecha (si las hay).
4.Unión exterior derecha: También llamado Unión Derecha.Devuelve filas coincidentes de la tabla de la izquierda (si las hay) y todas las filas presentes en la tabla de la derecha.
Ventajas de las uniones
- Se ejecuta más rápido.
Unir internamente - Un unir internamente el uso de cualquiera de las consultas equivalentes da la intersección de las dos mesas, es decir.las dos filas que tienen en común.
Izquierda combinación externa - A izquierda combinación externa dará todas las filas en A, más las filas comunes en B.
Unión exterior completa - A unión externa completa te dará la unión de A y B, es decirTodas las filas de A y todas las filas de B.Si algo en A no tiene un dato correspondiente en B, entonces la porción B es nula y viceversa.
left join on
(también conocido como left outer join on
) devoluciones inner join on
filas union all
filas de la tabla izquierda no coincidentes extendidas por nulos.
right join (on
alias right outer join on
) devoluciones inner join on
filas union all
filas de la tabla derecha no coincidentes extendidas por nulos.
full join on
(también conocido como full outer join on
) devoluciones inner join on
filasunion all
filas de la tabla izquierda no coincidentes extendidas por nulos union all
filas de la tabla derecha no coincidentes extendidas por nulos.
(SQL Standard 2006 SQL/Foundation 7.7 Reglas de sintaxis 1, Reglas generales 1 b, 3 c y d, 5 b.)
Así que no outer join
hasta que sepas lo que subyace inner join
esta involucrado.
Descubrir que filas inner join
devoluciones.
Lea mis comentarios, hay muchas respuestas confusas y deficientes.
Luego lea mis comentarios aquí sobre las muchas respuestas confusas y deficientes.
La diferencia entre unión interna y unión externa es la siguiente:
- La unión interna es una unión que combina tablas basadas en tuplas coincidentes, mientras que la unión externa es una unión que combina tablas basadas en tuplas coincidentes y no coincidentes.
- La unión interna fusiona filas coincidentes de dos tablas donde se omiten las filas no coincidentes, mientras que la unión externa fusiona filas de dos tablas y las filas no coincidentes se rellenan con un valor nulo.
- La unión interna es como una operación de intersección, mientras que la unión externa es como una operación de unión.
- La unión interna es de dos tipos, mientras que la unión externa es de tres tipos.
- La unión interna es más lenta, mientras que la unión externa es más rápida que la unión interna.
Considere a continuación 2 tablas:
PEM
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
Departamento
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
Unir internamente:
Mayormente escrito como simplemente UNIRSE en consultas SQL.Devuelve sólo los registros coincidentes entre las tablas.
Descubra todos los empleados y los nombres de sus departamentos:
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
Como ves arriba, Jose
no está impreso desde PEM en la salida ya que es dept_id 6
no encuentra una coincidencia en la tabla Departamento.Similarmente, HR
y R&D
las filas no se imprimen desde Departamento tabla ya que no encontraron una coincidencia en la tabla Emp.
Entonces, INNER JOIN o simplemente JOIN, devuelve solo filas coincidentes.
ÚNETE A LA IZQUIERDA:
Esto devuelve todos los registros de la tabla IZQUIERDA y solo los registros coincidentes de la tabla DERECHA.
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
Entonces, si observa el resultado anterior, todos los registros de la tabla IZQUIERDA (Emp) se imprimen solo con registros coincidentes de la tabla DERECHA.
HR
y R&D
las filas no se imprimen desde Departamento table ya que no encontraron una coincidencia en la tabla Emp en dept_id.
Entonces, LEFT JOIN devuelve TODAS las filas de la tabla izquierda y solo las filas coincidentes de la tabla DERECHA.
También puede consultar DEMO aquí.