También cómo hacerlo LEFT JOIN
, RIGHT JOIN
y FULL JOIN
en todo esto?
También cómo hacerlo LEFT JOIN
, RIGHT JOIN
y FULL JOIN
en todo esto?
Respuestas:
Suponiendo que se está uniendo en columnas sin duplicados, que es un caso muy común:
Una unión interna de A y B da el resultado de la intersección de A B, es decir, la parte interna de una intersección del diagrama de Venn .
Una unión externa de A y B da los resultados de una 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 los datos de la siguiente manera:
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 unión interna que utiliza cualquiera de las consultas equivalentes proporciona 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
Izquierda combinación externa
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 exterior 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
Unión externa completa
Una unión externa completa le dará la unión de A y B, es decir, todas las filas en A y todas las filas en B. Si algo en A no tiene un dato correspondiente en B, entonces la porción B es nula y viceversa. 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
Los diagramas de Venn realmente no lo hacen por mí.
No muestran ninguna distinción entre una unión cruzada y una unión interna, por ejemplo, o más generalmente muestran alguna distinción entre diferentes tipos de predicado de unión o proporcionan un marco para razonar sobre cómo operarán.
No hay sustituto para comprender el procesamiento lógico y, de todos modos, es relativamente sencillo de comprender.
on
cláusula contra todas las filas del paso 1 manteniendo aquellas en las que el predicado evalúatrue
(Nota: 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 una combinación externa completa . Más explicación sigue.
Tablas de origen
Primero comience con un CROSS JOIN
(Producto AKA Cartesiano). Esto no tiene una ON
cláusula y simplemente devuelve cada combinación de filas de las dos tablas.
SELECCIONE A.Color, B.Color DE UNA CRUZ ÚNETE B
Las uniones internas y externas tienen un predicado de cláusula "ON".
SELECCIONE A.Colour, B.Colour DE UN INTERIOR ÚNASE B EN A.Colour = B.Colour
Lo anterior es el clásico equi join.
La condición de unión interna no necesariamente tiene que ser una condición de igualdad y no necesita hacer referencia a columnas de ambas (o incluso de ninguna) de las tablas. La evaluación A.Colour NOT IN ('Green','Blue')
en cada fila de la unión cruzada devuelve.
SELECCIONE A.Color, B.Color DE UNA UNIÓN INTERNA B EN 1 = 1
La condición de combinación se evalúa como verdadera para todas las filas en el resultado de combinación cruzada, por lo que esto es lo mismo que una combinación cruzada. No repetiré la imagen de las 16 filas nuevamente.
Las uniones externas se evalúan lógicamente de la misma manera que las uniones internas, excepto que si una fila de la tabla izquierda (para una combinación izquierda) no se une con ninguna fila de la tabla de la derecha, se conserva en el resultado con NULL
valores para columnas de la derecha.
Esto simplemente restringe el resultado anterior para que solo devuelva las filas donde B.Colour IS NULL
. En este caso particular, estas serán las filas que se conservaron ya que no tenían coincidencia 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-join.
Es importante seleccionar una columna para la IS NULL
prueba que no sea anulable o para la que la condición de unión garantice que NULL
se excluyan los valores para que este patrón funcione correctamente y evite simplemente recuperar las filas que tienen un NULL
valor para eso columna además de las filas no coincidentes.
Las uniones externas derechas actúan de manera similar a las uniones externas izquierdas, excepto que conservan las filas no coincidentes de la tabla derecha y anulan las columnas de la izquierda.
Las combinaciones externas completas combinan el comportamiento de las combinaciones izquierda y derecha y preservan las filas no coincidentes de las tablas izquierda y derecha.
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 externas normales con NULL en las columnas de la tabla del otro lado.
Con una modificación menor a la consulta anterior, se podría simular una UNION ALL
de las dos tablas.
Tenga en cuenta que la WHERE
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 no coincidentes. Lo anterior termina realizando la unión externa ...
... 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 de la sintaxis correcta sería
Vea estos ejemplos ejecutados en vivo en SQLFiddle.com .
Las uniones se utilizan para combinar los datos de dos tablas, con el resultado de ser una nueva tabla temporal. Las uniones se realizan en base a algo llamado predicado, que especifica la condición a usar 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 en función del predicado de combinación. Por ejemplo, consideremos la tabla de empleados y ubicación:
Unión interna: la unión interna crea una nueva tabla de resultados combinando valores de columna de dos tablas ( Empleado y Ubicación ) en función del 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 haciendo 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í 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 unión externa no requiere que cada registro en las dos tablas unidas tenga un registro coincidente. La tabla unida conserva cada registro, incluso si no existe otro registro coincidente. Las uniones externas se subdividen en uniones externas izquierdas y uniones externas derechas, dependiendo de las filas de la tabla que se retienen (izquierda o derecha).
Unión externa izquierda: - El resultado de una unión externa izquierda (o simplemente combinación izquierda) para las 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 combinación externa izquierda, utilizando 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 externa derecha: una unión externa derecha (o unión derecha) se parece mucho a una unión externa izquierda, excepto con el tratamiento de las tablas invertido. Cada fila de la tabla "derecha" ( Ubicación ) aparecerá en la tabla unida al menos una vez. Si no existe una fila coincidente de la tabla "izquierda" ( Empleado ), aparecerá NULL en 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 combinación externa derecha:
Completa combinaciones externas: - combinación externa completa o completa de Ingreso es retener la información que no coinciden mediante la inclusión de filas que no coinciden en los resultados de una combinación, utilice una combinación externa completa. Incluye todas las filas de ambas tablas, independientemente de si la otra tabla tiene o no un valor coincidente.
Recuperar las filas sólo comparable, es decir, A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Seleccione todos los registros de la primera tabla y todos los registros de la segunda tabla que coincidan con las teclas unidas.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Seleccione todos los registros de la segunda tabla y todos los registros de la primera tabla que coincidan con las teclas unidas.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
En palabras simples:
Una unión interna recupera solo las filas coincidentes.
Mientras que una combinación externa recupera las filas coincidentes de una tabla y todas las filas de otra tabla ... el resultado depende de cuál esté usando:
Izquierda : filas coincidentes en la tabla derecha y todas las filas en la tabla izquierda
Derecha : filas coincidentes en la tabla izquierda y todas las filas en la tabla derecha o
Completo : todas las filas en todas las tablas. No importa si hay una coincidencia o no
Una unión interna solo 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 una fila coincidente, las columnas para el otro lado (derecho) mostrarían 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 de pedidos y una tabla de detalles de pedido. Están relacionados por un "OrderID".
Pedidos
Detalles de la orden
La solicitud
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
solo devolverá los pedidos que también tengan algo en la tabla OrderDetails.
Si lo cambia a EXTERIOR IZQUIERDA UNIRSE
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
entonces devolverá registros de la tabla de pedidos incluso si no tienen registros de detalles de pedido.
Puede usar esto para buscar pedidos que no tengan detalles de pedido que indiquen un posible pedido huérfano agregando una cláusula where como WHERE OrderDetails.OrderID IS NULL
.
SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
a SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
(MySQL) con éxito. No estaba seguro de las condiciones adicionales, se mezclan bien ...
En palabras simples:
Unión interna -> Tome ÚNICAMENTE los registros comunes de las tablas padre e hijo DONDE la clave primaria de la tabla Padre coincide con la clave externa en la tabla Niño
Izquierda unirse ->
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.
}
}
Unión derecha : exactamente opuesto a la unión izquierda. Ponga el nombre de la tabla en LEFT JOIN en el lado derecho en Right join, obtendrá la misma salida que LEFT JOIN.
Unión externa : muestra todos los registros en ambas tablas No matter what
. Si los registros de la tabla izquierda no coinciden con la tabla derecha según la clave primaria y extranjera, use 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
una clave externa que conecta employee.id
su tabla secundaria).
Uniones internas
Tome los registros de 2 tablas SOLO 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í tome solo las filas coincidentes en la clave primaria = clave externa como se explicó anteriormente. Aquí las filas no coincidentes en la clave primaria = clave externa se omiten como resultado de la unión.
Izquierda se une :
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 externas :
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;
Diagramaticamente se ve así:
Se usa 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 haber 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 de todo tipo de uniones.
fuente: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
INNER JOIN
requiere que haya al menos una coincidencia en la comparación de las dos tablas. Por ejemplo, la tabla A y la tabla B que implican A ٨ B (una 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.
Del mismo modo, 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, así que en los resultados.
Nota:
EnSQLite
no hayRIGHT OUTER JOIN
oFULL OUTER JOIN
.
Y también adentroMySQL
no hayFULL OUTER JOIN
.
Mi respuesta se basa en la nota anterior .
Cuando tienes dos tablas como estas:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
CROSS JOIN / OUTER JOIN:
puede tener todos los datos de esas tablas con CROSS JOIN
o simplemente ,
así:
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
UNIÓN INTERNA:
cuando desee agregar un filtro a los resultados anteriores en función de una relación como table1.id = table2.id
puede 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 [EXTERIOR]:
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 la UNIÓN DERECHA simplemente cambie el lugar de las tablas)
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
FULL OUTER JOIN:
cuando también desea 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
Bueno, según su necesidad, elija cada uno que cubra su necesidad;).
full outer join
en MySQL.
Unir internamente.
Una combinación combina las filas de dos tablas. Una unión interna 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 en la unión coincide con dos filas en la segunda tabla, entonces 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 en la primera, no se devuelve.
Unión externa.
Una unión izquierda intenta encontrar coincidencias de las filas de la primera tabla a 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 (nulo).
INNER JOIN
unión más típica para dos o más tablas. Devuelve la coincidencia de datos tanto en la tabla EN relación con la tecla primaria como con la tecla forign.OUTER JOIN
es igual que INNER JOIN
, pero también incluye NULL
datos en ResultSet.
LEFT JOIN
= INNER JOIN
+ Datos noNull
coincidentes de la tabla izquierda con coincidencia en la tabla derecha.RIGHT JOIN
= INNER JOIN
+ Datos no coincidentes de la tabla derecha conNull
coincidentes de la coincidencia en la tabla izquierda.FULL JOIN
= INNER JOIN
+ Datos no coincidentes en las tablas derecha e izquierda con Null
coincidencias.INNER JOIN
y OUTER 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
No veo muchos detalles sobre el rendimiento y el optimizador en las otras respuestas.
A veces es bueno saber que solo INNER JOIN
es asociativo, lo que significa que el optimizador tiene la mayor opción para jugar con él. Puede reordenar el orden de unión para hacerlo más rápido manteniendo el mismo resultado. El optimizador puede usar la mayoría de los modos de combinación.
En general, es una buena práctica intentar usar en INNER JOIN
lugar de los diferentes tipos de combinaciones. (Por supuesto, si es posible teniendo en cuenta el conjunto de resultados esperado).
Aquí hay un par de buenos ejemplos y explicaciones sobre este extraño comportamiento asociativo:
INNER JOIN
es más lento que LEFT JOIN
en la mayoría de las veces, y las personas pueden usar en LEFT JOIN
lugar de INNER JOIN
agregar un WHERE
para eliminar NULL
resultados inesperados ;).
INNER
es más lento?
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 la mejor de este grupo por un largo camino, solo muestra la columna clave de cada tabla, mientras que creo que idealmente también deberían mostrarse las columnas no clave.
Lo mejor que pude hacer en la media hora permitida, todavía no creo que muestre adecuadamente que los valores nulos están allí debido a la ausencia de valores clave TableB
o que en OUTER JOIN
realidad es una unión en lugar de una unión:
TableA a LEFT OUTER JOIN TableB b
conTableB B RIGHT OUTER JOIN TableA a
Los algoritmos precisos para INNER JOIN
, LEFT/RIGHT OUTER JOIN
son los siguientes:
a
(a, b[i])
ON ...
cláusula contra cada par:ON( a, b[i] ) = true/false?
true
, devuelva esa fila combinada (a, b[i])
.Outer Join
retorno (virtual) usando Null
para todas las columnas de otra tabla: (a, Null)
para la unión externa IZQUIERDA o (Null, b)
para la unión externa DERECHA. Esto es para garantizar que todas las filas de la primera tabla existan en los resultados finales.Nota: ¡ la condición especificada en la ON
cláusula podría ser cualquier cosa, no es necesario usar Claves primarias (y no es necesario que se refiera siempre a 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.
Definiciones más simples
Unión interna: devuelve registros coincidentes de ambas tablas.
La combinación externa completa: Vuelve emparejados y los registros no coincidentes de ambas tablas con nulo para los registros no coincidentes de ambas tablas .
Unión externa izquierda: devuelve registros coincidentes y no coincidentes solo de la tabla del lado izquierdo .
Unión externa derecha: devuelve registros coincidentes y no coincidentes solo de la tabla en el lado derecho .
En breve
Igualado + Izquierdo No igualado + Derecha No igualado = externa completa
Igualado + Izquierdo No igualado = externa izquierda
Igualado + Derecha Sin igualar = externa derecha
Emparejado = unión interna
En lenguaje sencillo,
1. UNIÓN INTERNA O UNIÓN EQUI: Devuelve el conjunto de resultados que solo coincide con la condición en ambas tablas.
2. ÚNETE EXTERIOR: devuelve el conjunto de resultados de todos los valores de ambas tablas, incluso si hay una coincidencia de condición o no.
3. IZQUIERDA UNIRSE: Devuelve el conjunto de resultados de todos los valores de la tabla izquierda y solo las filas que coinciden con la condición en la tabla derecha.
4. UNIRSE A LA DERECHA: Devuelve el conjunto de resultados de todos los valores de la tabla derecha y solo las filas que coinciden con la condición de la tabla izquierda.
5. UNIÓN COMPLETA: La unión completa y la unión externa completa son iguales.
Ejemplos
Suponga que tiene dos tablas, con una sola columna cada una, y los datos de la siguiente manera:
A B
- -
1 3
2 4
3 5
4 6
7
8
Tenga en cuenta que (1,2,7,8) son exclusivos de A, (3,4) son comunes y (5,6) son exclusivos de B.
La palabra clave INNER JOIN selecciona todas las filas de ambas tablas siempre que la condición satisfaga. Esta palabra clave creará el conjunto de resultados combinando todas las filas de ambas tablas donde la condición satisface, es decir, el valor del campo común será el mismo.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
Resultado:
a | b
--+--
3 | 3
4 | 4
Esta combinación devuelve todas las filas de la tabla en el lado izquierdo de la combinación y las filas coincidentes para la tabla en el lado derecho de la combinación. Las filas para las que no hay una fila coincidente en el lado derecho, el conjunto de resultados contendrá nulo. IZQUIERDA UNIRSE también se conoce como LEFT OUTER JOIN
.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
Resultado:
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
7 | null
8 | null
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
Resultado:
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
UNIÓN COMPLETA (EXTERIOR) :
FULL JOIN crea el conjunto de resultados combinando el resultado de LEFT JOIN y RIGHT JOIN. El conjunto de resultados contendrá todas las filas de ambas tablas. Las filas para las que no hay coincidencias, el conjunto de resultados contendrá valores NULL.
select * from a FULL OUTER JOIN b on a.a = b.b;
Resultado:
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
7 | null
8 | null
Unión interna : una combinación interna que utiliza cualquiera de las consultas equivalentes proporciona la intersección de las dos tablas , es decir, las dos filas que tienen en común.
Unión externa izquierda : una combinación externa izquierda dará todas las filas en A, más cualquier fila común en B.
Externa completa - Una combinación externa completa le dará la unión de A y B, es decir, todas las filas de una y todas las filas de B. Si algo en A no tiene un dato correspondiente en B, entonces B es la parte nulo y viceversa
Join is not an intersection unless the tables have the same columns
No. Puede unir las columnas que desee y si el valor coincide, se unirán.
1. Inner Join: también llamada como Join. Devuelve las filas presentes tanto en la tabla izquierda como en la tabla derecha solo 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 llamada como Unión completa. Devuelve todas las filas. presentes 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. Unión externa izquierda: O simplemente llamada Unión izquierda. Devuelve todas las filas presentes en la tabla izquierda y las filas coincidentes de la tabla derecha (si corresponde).
4. Unión externa derecha: también llamada Unión derecha. Devuelve filas coincidentes de la tabla izquierda (si corresponde) y todas las filas presentes en la tabla Derecha.
Ventajas de las uniones
Considere a continuación 2 tablas:
EMP
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
Principalmente escrito como solo ÚNETE en consultas SQL. Solo devuelve los registros coincidentes entre las tablas.
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 puede ver arriba, Jose
no se imprime desde EMP en la salida ya que dept_id 6
no encuentra una coincidencia en la tabla Departamento. Del mismo modo, HR
y las R&D
filas no se imprimen desde la tabla Departamento ya que no encontraron una coincidencia en la tabla Emp.
Entonces, INNER JOIN o simplemente JOIN, devuelve solo las filas coincidentes.
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 con solo registros coincidentes de la tabla DERECHA.
HR
y las R&D
filas no se imprimen desde la tabla Departamento 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í .
Consulte la respuesta de Martin Smith para obtener mejores ilustraciones y explicaciones de las diferentes combinaciones, incluidas, y especialmente, las diferencias entre FULL OUTER JOIN
, RIGHT OUTER JOIN
y LEFT OUTER JOIN
.
Estas dos tablas forman una base para la representación de las JOIN
siguientes s:
SELECT *
FROM citizen
CROSS JOIN postalcode
El resultado serán los productos cartesianos de todas las combinaciones. No se JOIN
requiere condición:
INNER JOIN
es lo mismo que simplemente: JOIN
SELECT *
FROM citizen c
JOIN postalcode p ON c.postal = p.postal
El resultado serán combinaciones que satisfagan la JOIN
condición requerida :
LEFT OUTER JOIN
es lo mismo que LEFT JOIN
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
El resultado será todo, citizen
incluso si no hay coincidencias postalcode
. Nuevamente JOIN
se requiere una condición:
Todos los ejemplos se han ejecutado en un Oracle 18c. Están disponibles en dbfiddle.uk, que también es de donde provienen las capturas de pantalla de las tablas.
CREATE TABLE citizen (id NUMBER,
name VARCHAR2(20),
postal NUMBER, -- <-- could do with a redesign to postalcode.id instead.
leader NUMBER);
CREATE TABLE postalcode (id NUMBER,
postal NUMBER,
city VARCHAR2(20),
area VARCHAR2(20));
INSERT INTO citizen (id, name, postal, leader)
SELECT 1, 'Smith', 2200, null FROM DUAL
UNION SELECT 2, 'Green', 31006, 1 FROM DUAL
UNION SELECT 3, 'Jensen', 623, 1 FROM DUAL;
INSERT INTO postalcode (id, postal, city, area)
SELECT 1, 2200, 'BigCity', 'Geancy' FROM DUAL
UNION SELECT 2, 31006, 'SmallTown', 'Snizkim' FROM DUAL
UNION SELECT 3, 31006, 'Settlement', 'Moon' FROM DUAL -- <-- Uuh-uhh.
UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space' FROM DUAL;
JOIN
yWHERE
CROSS JOIN
resultando en filas como La idea general / INNER JOIN
:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows
Usar CROSS JOIN
para obtener el resultado de un LEFT OUTER JOIN
requiere trucos como agregar en una NULL
fila. Se omite
INNER JOIN
se convierte en un producto cartesiano. Es lo mismo que La idea general / CROSS JOIN
:
SELECT *
FROM citizen c
JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN
Aquí es donde realmente se puede ver la unión interna como la unión cruzada con resultados que no coinciden con la condición eliminada. Aquí ninguna de las filas resultantes se eliminan.
Usar INNER JOIN
para obtener el resultado de a LEFT OUTER JOIN
también requiere trucos. Se omite
LEFT JOIN
da como resultado filas como La idea general / CROSS JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN
LEFT JOIN
da como resultado filas como La idea general / INNER JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode
Una búsqueda de imágenes en Internet en "sql join cross inner inner" mostrará una multitud de diagramas de Venn. Solía tener una copia impresa de uno en mi escritorio. Pero hay problemas con la representación.
Los diagramas de Venn son excelentes para la teoría de conjuntos, donde un elemento puede estar en uno o en ambos conjuntos. Pero para las bases de datos, un elemento en un "conjunto" me parece ser una fila en una tabla y, por lo tanto, no está presente en ninguna otra tabla. No existe una fila presente en varias tablas. Una fila es exclusiva de la tabla.
Las autouniones son un caso de esquina donde cada elemento es de hecho el mismo en ambos conjuntos. Pero todavía no está libre de ninguno de los siguientes problemas.
El conjunto A
representa el conjunto de la izquierda (la citizen
tabla) y el conjunto B
es el conjunto de la derecha (la postalcode
tabla) en la discusión a continuación.
Cada elemento en ambos conjuntos se corresponde con cada elemento en el otro conjunto, lo que significa que necesitamos la A
cantidad de cada B
elemento y la B
cantidad de cada A
elemento para representar adecuadamente este producto cartesiano. La teoría de conjuntos no está hecha para múltiples elementos idénticos en un conjunto, por lo que encuentro que los diagramas de Venn para representarlos adecuadamente no son prácticos / imposibles. No parece queUNION
encaje en absoluto.
Las filas son distintas. El UNION
es de 7 filas en total. Pero son incompatibles para un SQL
conjunto de resultados común . Y no es así como CROSS JOIN
funciona en absoluto:
Intentando representarlo así:
.. pero ahora solo parece un INTERSECTION
, que ciertamente no lo es . Además, no hay ningún elemento en el INTERSECTION
que esté realmente en ninguno de los dos conjuntos distintos. Sin embargo, se parece mucho a los resultados de búsqueda similares a este:
Como referencia, CROSS JOIN
se puede ver un resultado de búsqueda para s en Tutorialgateway . El INTERSECTION
, al igual que este, está vacío.
El valor de un elemento depende de la JOIN
condición. Es posible representar esto bajo la condición de que cada fila se vuelva única para esa condición. El significado id=x
solo es cierto para una fila. Una vez que una fila en la tabla A
( citizen
) coincide con varias filas en la tabla B
( postalcode
) bajo la JOIN
condición, el resultado tiene los mismos problemas que CROSS JOIN
: La fila debe representarse varias veces, y la teoría de conjuntos no está hecha para eso. Sin embargo, bajo la condición de unicidad, el diagrama podría funcionar, pero tenga en cuenta que la JOIN
condición determina la ubicación de un elemento en el diagrama. Mirando solo los valores de la JOIN
condición con el resto de la fila a lo largo del recorrido:
Esta representación se desmorona por completo cuando se usa un INNER JOIN
con una ON 1 = 1
condición que lo convierte en a CROSS JOIN
.
Con un self JOIN
, las filas son de hecho elementos idénticos en ambas tablas, pero representan las tablas como ambas A
y B
no es muy adecuado. Por ejemplo, un auto común JOIN
condición que hace que un elemento en A
que se emparejan a diferente elemento en B se ON A.parent = B.child
, haciendo que el partido de A
que B
en elementos separados. De los ejemplos que serían SQL
así:
SELECT *
FROM citizen c1
JOIN citizen c2 ON c1.id = c2.leader
Lo que significa que Smith es el líder de Green y Jensen.
Nuevamente, los problemas comienzan cuando una fila tiene múltiples coincidencias con filas en la otra tabla. Esto se complica aún más porque se OUTER JOIN
puede pensar que coincide con el conjunto vacío. Pero en la teoría de conjuntos, la unión de cualquier conjunto C
y un conjunto vacío siempre es justa C
. El conjunto vacío no agrega nada. La representación de esto LEFT OUTER JOIN
generalmente solo muestra todo A
para ilustrar que las filas A
se seleccionan independientemente de si hay una coincidencia o no B
. Sin embargo, los "elementos coincidentes" tienen los mismos problemas que la ilustración anterior. Dependen de la condición. Y el conjunto vacío parece haberse acercado a A
:
Encontrar todas las filas de a CROSS JOIN
con Smith y código postal en la Luna:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
AND p.area = 'Moon';
Ahora el diagrama de Venn no se usa para reflejar el JOIN
. Se usa solo para la WHERE
cláusula:
..y eso tiene sentido.
Como se explicó, an INNER JOIN
no es realmente un INTERSECT
. Sin embargo, INTERSECT
s puede usarse en resultados de consultas separadas. Aquí un diagrama de Venn tiene sentido, porque los elementos de las consultas separadas son, de hecho, filas que pertenecen a uno de los resultados o a ambos. Intersecar obviamente solo devolverá resultados donde la fila está presente en ambas consultas. Esto SQL
dará como resultado la misma fila que la anterior WHERE
, y el diagrama de Venn también será el mismo:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
INTERSECT
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
An OUTER JOIN
no es un UNION
. Sin embargo, UNION
trabaje en las mismas condiciones que INTERSECT
, dando como resultado un retorno de todos los resultados combinando ambos SELECT
s:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
UNION
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
que es equivalente a:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
OR p.area = 'Moon';
..y da el resultado:
También aquí tiene sentido un diagrama de Venn:
Una nota importante es que estos solo funcionan cuando la estructura de los resultados de los dos SELECT son iguales, lo que permite una comparación o unión. Los resultados de estos dos no permitirán que:
SELECT *
FROM citizen
WHERE name = 'Smith'
SELECT *
FROM postalcode
WHERE area = 'Moon';
..intentando combinar los resultados con UNION
da un
ORA-01790: expression must have same datatype as corresponding expression
Para mayor interés, lea Di NO a los diagramas de Venn al explicar JOINs y sql se une como diagrama de Venn . Ambos también cubren EXCEPT
.
Aquí hay muchas buenas respuestas con ejemplos de álgebra relacional muy precisos . Aquí hay una respuesta muy simplificada que podría ser útil para codificadores aficionados o novatos con dilemas de codificación SQL.
Básicamente, la mayoría de las veces, las consultas JOIN
se reducen a dos casos:
Para un SELECT
subconjunto de datos A
:
INNER JOIN
cuando los datos relacionados B
que busca DEBEN existir por diseño de base de datos;LEFT JOIN
cuando los datos relacionados B
que busca PODRÍAN o NO PODRÍAN existir por diseño de base de datos.La diferencia entre inner join
y outer join
es la siguiente:
Inner join
es una combinación que combina tablas basadas en tuplas coincidentes, mientras que outer join
es una combinación que combina tablas basadas en tuplas coincidentes y no coincidentes.Inner join
combina filas coincidentes de dos tablas en las que se omiten filas no coincidentes, mientras que las outer join
filas combinadas de dos tablas y las filas no coincidentes se llenan con un valor nulo.Inner join
es como una operación de intersección, mientras que outer join
es como una operación de unión.Inner join
son dos tipos, mientras que outer join
son tres tipos.outer join
es más rápido que inner join
.