Pregunta

También ¿cómo LEFT JOIN, RIGHT JOIN y FULL JOIN encajar?

¿Fue útil?

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.

  1. Imagine una unión cruzada.
  2. Evalúa el on cláusula contra todas las filas del paso 1 manteniendo aquellas donde el predicado se evalúa como true
  3. (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.

enter image description here


Explicación

Tablas fuente

enter link description here

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

enter link description here

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.

Inner Join

Versión animada

enter image description here

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.

inner 2

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.

LOJ

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.

loj is null

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.

ROJ

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.

FOJ

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.

FOJ 2

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.

UNION ALL

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...

LOJ

...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.

LOJtoInner

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'

enter image description here

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:

enter image description here

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:enter image description here enter image description here

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:enter image description here enter image description here

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:

enter image description hereenter image description here

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.enter image description here

Fuente de imagen

Manual de referencia de MySQL 8.0: sintaxis de unión

Operaciones de unión de Oracle

Unir internamente

Recuperar solo las filas coincidentes, es decir, A intersect B.

Enter image description here

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.

Enter image description here

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.

Enter image description here

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 :

Example

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í:

Diagram

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.

This is a good explanation for joins

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 :
En SQLite no hay RIGHT OUTER JOIN o FULL OUTER JOIN.
Y también en MySQL no hay FULL 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:

  1. Tome cada fila de la primera tabla: a
  2. Considere todas las filas de la segunda tabla al lado: (a, b[i])
  3. 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 usando Null 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.

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:

Inner Join vs. Left Outer Join


enter image description here

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:

enter image description here

enter image description here

  • 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 que INNER JOIN, pero también incluye NULL datos en ResultSet.
    • LEFT JOIN = INNER JOIN + Datos inigualables de izquierda mesa con Null coincidencia en la mesa de la derecha.
    • RIGHT JOIN = INNER JOIN + Datos inigualables de bien mesa con Null partido en la mesa de la izquierda.
    • FULL JOIN = INNER JOIN + Datos inigualables sobre tanto derecha como izquierda mesas con Null 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 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 

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

output1

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

output2

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.

joins

Ventajas de las uniones

  1. 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:

  1. 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.
  2. 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.
  3. 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.
  4. La unión interna es de dos tipos, mientras que la unión externa es de tres tipos.
  5. 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í.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top