¿Cuál es la diferencia entre "INNER JOIN" y "OUTER JOIN"?


4672

También cómo hacerlo LEFT JOIN, RIGHT JOINy FULL JOINen todo esto?


64
De las respuestas y comentarios y sus referencias a continuación, solo uno realmente explica cómo los diagramas de Venn representan a los operadores: el área de intersección del círculo representa el conjunto de filas en A JOIN B. El área exclusiva de cada círculo representa el conjunto de filas que obtiene al tomar su Las filas de la tabla que no participan en A UNIRSE A B y agregar las columnas exclusivas de la otra tabla están todas configuradas en NULL. (Y la mayoría da una vaga correspondencia falsa de los círculos a A y B.)
Filipinas

1
Saltando de las respuestas basadas en la teoría a continuación, a una aplicación del mundo real: a menudo trabajo con datos de experimentos, ejecutando puntos de referencia en diseños de procesadores. A menudo deseo comparar los resultados entre 2 o más opciones de hardware. INNER JOIN significa que solo veo los puntos de referencia que se ejecutaron con éxito en todos los experimentos; OUTER JOIN significa que puedo ver todos los experimentos, incluidos los que no se pudieron ejecutar en algunas configuraciones. Es importante ver fallas en tales experimentos, así como éxitos. Lo suficientemente importante como para escribir PerlSQL para obtener OUTER JOIN, cuando muchos RDBMS no lo tenían,
Krazy Glew

44
Ya se proporcionan muchas respuestas, pero no he visto este tutorial mencionado. Si conoce los diagramas de Venn, este es un GRAN tutorial: blog.codinghorror.com/a-visual-explanation-of-sql-joins Para mí, es lo suficientemente conciso como para ser una lectura rápida, pero aún comprende todo el concepto y funciona todo Casos muy bien. Si no sabe qué son los diagramas de Venn, apréndalos. Tarda de 5 a 10 minutos en hacerlo y le ayudará cada vez que necesite visualizar el trabajo con conjuntos y la gestión de operaciones en conjuntos.
DanteTheSmith

15
@DanteTheSmith No, eso tiene los mismos problemas que los diagramas aquí. Vea mi comentario arriba sobre la pregunta y abajo sobre la misma publicación del blog: "Jeff repudia su blog unas páginas más abajo en los comentarios". Los diagramas de Venn muestran elementos en conjuntos. Solo trate de identificar exactamente cuáles son los conjuntos y cuáles son los elementos en estos diagramas. Los conjuntos no son las tablas y los elementos no son sus filas. Además, se pueden unir dos tablas, por lo que las PK y FK no son relevantes. Todo falso. Estás haciendo exactamente lo que miles de personas han hecho: tienes una vaga impresión que (erróneamente) asumes que tiene sentido.
Filipinas

3
Chris, te recomiendo que leas este artículo: intodatascience.com/… ... y consideres cambiar tu elección de respuesta aceptada (quizás la que tiene la recompensa) por una respuesta que no use diagramas de Venn. La respuesta actualmente aceptada es engañar a demasiadas personas. Le insto a que haga esto por el bien de nuestra comunidad y la calidad de nuestra base de conocimiento.
Colm Bhandal

Respuestas:


6116

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

42
Sería bueno aumentar el ejemplo agregando otra fila en la tabla B con valor 4. Esto mostrará que las uniones internas no necesitan estar en igual número de filas.
softveda

473
Una excelente explicación, sin embargo, esta afirmación: una unión externa de A y B da los resultados de la unión A B, es decir, las partes externas de una unión de diagrama de Venn. No está redactado con precisión. Una unión externa dará los resultados de la intersección A de B además de uno de los siguientes: todo A (unión izquierda), todo B (unión derecha) o todo A y todo B (unión completa). Solo este último escenario es realmente Una unión B. Aún así, una explicación bien escrita.
Thomas

11
¿Estoy en lo cierto de que FULL JOIN es un alias de FULL OUTER JOIN y LEFT JOIN es un alias de LEFT OUTER JOIN?
Damian

3
Sí genial y excelente explicación. pero ¿por qué en la columna b los valores no están en orden? es decir, es 6,5 no como 5,6?
Ameer

77
@Ameer, gracias. Unirse no garantiza un pedido, deberá agregar una cláusula ORDER BY.
Mark Harrison

734

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.

  1. Imagina una unión cruzada.
  2. Evalúe la oncláusula contra todas las filas del paso 1 manteniendo aquellas en las que el predicado evalúatrue
  3. (Solo para combinaciones externas) agregue nuevamente en las filas externas que se perdieron en el paso 2.

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

ingrese la descripción de la imagen aquí


Explicación

Tablas de origen

ingrese la descripción del enlace aquí

Primero comience con un CROSS JOIN(Producto AKA Cartesiano). Esto no tiene una ONcláusula y simplemente devuelve cada combinación de filas de las dos tablas.

SELECCIONE A.Color, B.Color DE UNA CRUZ ÚNETE B

ingrese la descripción del enlace aquí

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 unión cruzada. Si es verdadero, devuelve la fila unida. De lo contrario, deséchelo.
  • Izquierda combinación externa. Igual que la unión interna, entonces, para cualquier fila de la tabla izquierda que no coincida con nada, genera estos valores NULL para las columnas de la tabla derecha.
  • Unión externa derecha. Igual que la unión interna, entonces, para cualquier fila de la tabla derecha que no coincida con nada, genera estos valores NULL para las columnas de la tabla izquierda.
  • Unión externa completa. Igual que la unión interna, luego conserva 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.Colour, B.Colour DE UN INTERIOR ÚNASE B EN A.Colour = B.Colour

Lo anterior es el clásico equi join.

Unir internamente

Versión animada

ingrese la descripción de la imagen aquí

SELECCIONE A.Color, B.Color DESDE UNA UNIÓN INTERNA B EN A.Color NO EN ('Verde', 'Azul')

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.

interior 2

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.

SELECCIONE A.Colour, B.Colour DESDE UNA IZQUIERDA EXTERIOR ÚNASE B EN A.Colour = B.Colour

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 NULLvalores para columnas de la derecha.

LOJ

SELECCIONE A.Colour, B.Colour DESDE UNA IZQUIERDA EXTERIOR ÚNASE B EN A.Colour = B.Colour DONDE B.Colour ES NULO

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 NULLprueba que no sea anulable o para la que la condición de unión garantice que NULLse excluyan los valores para que este patrón funcione correctamente y evite simplemente recuperar las filas que tienen un NULLvalor para eso columna además de las filas no coincidentes.

loj es nulo

SELECCIONE A.Colour, B.Colour DESDE UN EXTERIOR DERECHO ÚNASE B EN A.Colour = B.Colour

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.

ROJ

SELECCIONE A.Colour, B.Colour DESDE UN EXTERIOR COMPLETO ÚNASE B EN A.Colour = B.Colour

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.

FOJ

SELECCIONE A.Color, B.Color DE UNA EXTERIOR COMPLETA ÚNASE B EN 1 = 0

Ninguna fila en la unión cruzada coincide con el 1=0predicado. 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.

FOJ 2

SELECCIONE COALESCE (A.Colour, B.Colour) COMO Color DE UN EXTERIOR COMPLETO ÚNASE B EN 1 = 0

Con una modificación menor a la consulta anterior, se podría simular una UNION ALLde las dos tablas.

UNIÓN TODO

SELECCIONE A.Colour, B.Colour DESDE UNA IZQUIERDA EXTERIOR ÚNASE B EN A.Colour = B.Colour DONDE B.Colour = 'Green'

Tenga en cuenta que la WHEREclá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 ...

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 de la sintaxis correcta sería

SELECCIONE A.Colour, B.Colour DESDE UNA IZQUIERDA EXTERIOR ÚNASE B EN A.Colour = B.Colour AND B.Colour = 'Green'

ingrese la descripción de la imagen aquí

Violín de SQL

Vea estos ejemplos ejecutados en vivo en SQLFiddle.com .


46
Diré que si bien esto no funciona para mí tan bien como los diagramas de Venn, aprecio que las personas varíen y aprendan de manera diferente y esta es una explicación muy bien presentada a diferencia de cualquiera que haya visto antes, por lo que apoyo a @ypercube en otorgando los puntos de bonificación. También un buen trabajo que explica la diferencia de poner condiciones adicionales en la cláusula JOIN frente a la cláusula WHERE. Felicitaciones a usted, Martin Smith.
Old Pro

22
@OldPro Supongo que los diagramas de Venn están bien hasta donde llegan, pero no mencionan cómo representar una unión cruzada o diferenciar un tipo de predicado de unión como equi join de otro. El modelo mental de evaluar el predicado de unión en cada fila del resultado de la unión cruzada y luego agregar nuevamente en filas no coincidentes si una unión externa y finalmente evaluar dónde funciona mejor para mí.
Martin Smith

18
Los diagramas de Venn son buenos para representar Uniones e Intersecciones y Diferencias, pero no unen. Tienen un valor educativo menor para las uniones muy simples, es decir, las uniones donde la condición de unión está en columnas únicas.
ypercubeᵀᴹ

12
@ Arthur - No, te equivocas. SQL Fiddle sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 esto es algo que los diagramas de Venn no pueden ilustrar.
Martin Smith

77
@ MartinSmith Wow, estoy de acuerdo, ¡estoy totalmente equivocado! Demasiado acostumbrado a trabajar con one-to-manys ... gracias por la corrección.
Arth

188

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:

ingrese la descripción de la imagen aquí

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: ingrese la descripción de la imagen aquí

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: ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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.

Fuente de imagen

Manual de referencia de MySQL 8.0 - Sintaxis de unión

Operaciones de Oracle Join


3
mejor respuesta hasta ahora, sintaxis alternativa: eso es lo que he estado buscando, ¡gracias!
Joey

1
Los diagramas de Venn están mal etiquetados. Vea mis comentarios sobre la pregunta y otras respuestas. Además, la mayor parte de este lenguaje es pobre. Por ejemplo: "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". No, no "Cuando el predicado de unión se satisface haciendo coincidir valores no NULL". Los valores en las filas no importan más que si la condición en su conjunto es verdadera o falsa. Algunos valores podrían ser NULL para una condición verdadera.
Filipinas

Aunque no se indica explícitamente, los diagramas en este son diagramas de Venn. Los diagramas de Venn no son, en general, la caracterización matemática correcta de una unión. Sugiero eliminar los diagramas de Venn.
Colm Bhandal

@ColmBhandal: diagramas de Venn eliminados
ajitksharma

Utilice texto, no imágenes / enlaces, para texto, incluidas tablas y ERD . Use imágenes solo para lo que no se puede expresar como texto o para aumentar el texto. Las imágenes no se pueden buscar ni cortar ni pegar. Incluya una leyenda / clave y explicación con una imagen.
philipxy

133

Unir internamente

Recuperar las filas sólo comparable, es decir, A intersect B.

Ingrese la descripción de la imagen aquí

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 todos los registros de la segunda tabla que coincidan con las teclas unidas.

Ingrese la descripción de la imagen aquí

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 todos los registros de la primera tabla que coincidan con las teclas unidas.

Ingrese la descripción de la imagen aquí

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Referencias


14
¿Cuál es el nombre de la herramienta? Me parece interesante, ya que muestra el número de filas y diagramas de
Venn

2
@GrijeshChauhan Sí, pero puedes intentar ejecutarlo con vino .
Tushar Gupta - curioustushar

2
Ohh! sí, yo ... usé SQLyog con vino ... también está PlayOnLinux
Grijesh Chauhan el

1
Su texto no está claro y está mal. Las "filas coincidentes solamente" son filas de la unión cruzada de A y B y lo que se recupera (una unión interna B) no es una intersección B sino una (unión izquierda B) intersección (una unión derecha B). Las filas "seleccionadas" no son de A y B, son de A cross join B & de valores nulos extendidos de filas de A y B.
philipxy

@ TusharGupta-curioustushar debe incluir las "Tablas utilizadas para los ejemplos de SQL"
Manuel Jordan

112

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


1
@nomen No es que esta respuesta lo aborde, pero INNER JOIN es una intersección y FULL OUTER JOIN es la UNIÓN correspondiente si los conjuntos / círculos izquierdo y derecho contienen las filas de unión (respectivamente) IZQUIERDA y DERECHA. PD Esta respuesta no está clara acerca de las filas en entrada vs salida. Confunde "en la tabla izquierda / derecha" con "tiene una parte izquierda / derecha en la izquierda / derecha" y utiliza "fila coincidente" frente a "todos" para significar fila extendida por fila desde otra tabla frente a nulos.
philipxy

104

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.


82

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

  • Solicitar ID
  • Nombre del cliente

Detalles de la orden

  • OrderDetailID
  • 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á 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.


1
Aprecio el ejemplo simple pero realista. Cambié una petición como 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 ASCa 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 ...
PhiLho

68

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:

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_iduna clave externa que conecta employee.idsu 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í:

Diagrama


44
El resultado no tiene nada que ver (hacer per se) con claves primarias / únicas / candidatas y claves externas. El baviour puede y debe describirse sin referencia a ellos. Se calcula una unión cruzada, luego las filas que no coinciden con la condición ON se filtran; además, para combinaciones externas filas filtradas / filas no coincidentes se extienden por valores NULL (por IZQUIERDA / DERECHA / FULL e incluidos.
philipxy

La suposición de que las uniones SQL siempre coinciden con las claves primarias / externas está llevando a este mal uso de los diagramas de Venn. Por favor revise su respuesta en consecuencia.
Colm Bhandal

58

Se usa INNER JOINpara 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 JOINla tabla resultante puede haber columnas vacías. La unión externa puede ser LEFTo 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.



54

INNER JOINrequiere 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 JOINy RIGHT JOINson lo mismo. Proporciona todos los registros que coinciden en ambas tablas y todas las posibilidades de la tabla correcta.

FULL JOINes la combinación de LEFT OUTER JOINy RIGHT OUTER JOINsin duplicación.


43

La respuesta está en el significado de cada uno, así que en los resultados.

Nota:
En SQLiteno hay RIGHT OUTER JOINo FULL OUTER JOIN.
Y también adentro MySQLno hay FULL 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 JOINo 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.idpuede 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;).


Puede agregar a su nota que tampoco hay full outer joinen MySQL.
potashin

35

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


28

ingrese la descripción de la imagen aquí

  • INNER JOINunió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 JOINes igual que INNER JOIN, pero también incluye NULLdatos 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 Nullcoincidencias.
  • La unión automática no es una palabra clave en SQL, cuando una tabla hace referencia a datos en sí misma conocida como unión automática. Usando INNER JOINy OUTER JOINpodemos 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 

27

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


44
No puede ser una "buena práctica" usar un tipo de unión sobre otro. La combinación que use determina los datos que desea. Si usa uno diferente, es incorrecto. Además, en Oracle, al menos, esta respuesta es completamente incorrecta. Suena completamente mal para todo y no tienes pruebas. ¿Tienes prueba?
Ben

1. Me refiero a intentar usar. Vi a muchas personas usando LEFT OUTER uniéndose a todas partes sin ninguna buena razón. (Las columnas unidas eran "no nulas".) En esos casos, definitivamente sería mejor usar combinaciones INNER. 2. He agregado un enlace que explica el comportamiento no asociativo mejor de lo que podría.
Lajos Veres

Como sé, INNER JOINes más lento que LEFT JOINen la mayoría de las veces, y las personas pueden usar en LEFT JOINlugar de INNER JOINagregar un WHEREpara eliminar NULLresultados inesperados ;).
shA.t

Estos comentarios me hicieron dudar un poco. ¿Por qué crees que INNERes más lento?
Lajos Veres

Depende del motor. gnu join, joinkeys, DB2, MySQL. Abundan las trampas de rendimiento, como la escritura suelta o un reparto explícito.
mckenzm

26

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 TableBo que en OUTER JOINrealidad es una unión en lugar de una unión:

ingrese la descripción de la imagen aquí


2
Sin embargo, la pregunta es sobre la diferencia entre las uniones INNER y OUTER, no necesariamente la combinación externa izquierda jajaja
LearnByReading

@LearnByReading: mi imagen de la derecha es una combinación externa derecha, es decir, reemplazar TableA a LEFT OUTER JOIN TableB bconTableB B RIGHT OUTER JOIN TableA a
cuando el

26

Los algoritmos precisos para INNER JOIN, LEFT/RIGHT OUTER JOINson 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úe la ON ...cláusula contra cada par:ON( a, b[i] ) = true/false?
    • Cuando la condición se evalúa como true, devuelva esa fila combinada (a, b[i]).
    • Cuando llegue al final de la segunda tabla sin ninguna coincidencia, y este es un Outer Joinretorno (virtual) usando Nullpara 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 ONclá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:

Unión interna vs. Unión externa izquierda


ingrese la descripción de la imagen aquí

Nota: Unión izquierda = Unión exterior izquierda, Unión derecha = Unión exterior derecha.


20

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


1
Esto es brillante y explica por qué unirse no funciona como se esperaba para los índices de series temporales. Las marcas de tiempo con un segundo de diferencia no tienen comparación.
yeliabsalohcin

1
@yeliabsalohcin No explicas "como se esperaba" aquí o "funciona" en tu comentario sobre la pregunta. Es solo un error personal inexplicable que extrañamente espera que otros tengan. Si trata las palabras de manera descuidada cuando está leyendo, malinterpretando una escritura clara y / o aceptando una escritura poco clara, como cuando está escribiendo aquí, entonces puede esperar tener conceptos erróneos. De hecho, esta respuesta como la mayoría aquí no es clara y está equivocada. "Unión interna: devuelve registros coincidentes de ambas tablas" es incorrecto cuando los conjuntos de columnas de entrada difieren. Está tratando de decir algo, pero no lo es . (Ver mi respuesta.)
philipxy

9

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.


5

Existen principalmente dos tipos principales de JOIN en SQL: [INNER y OUTER]


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.



  • (INTERIOR) ÚNETE :

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.

UNIR INTERNAMENTE

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


  • IZQUIERDA (EXTERIOR) ÚNETE :

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.

IZQUIERDA / IZQUIERDA EXTERIOR

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


  • UNIÓN DERECHA (EXTERIOR) : devuelve todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda

UNIÓN DERECHA / UNIÓN EXTERIOR DERECHA

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.

FULL JOIN / FULL OUTER JOIN

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

1
Los diagramas de Venn no son suficientes para describir las uniones SQL en el caso general. Las uniones SQL no necesariamente tienen que coincidir las filas entre las tablas de una a una, por ejemplo, utilizando la clave externa frente a la clave primaria.
Colm Bhandal

¿Cómo se unen 2 tablas sin que coincida la fila? Debe necesitar una columna de clave primaria o externa o algún campo común para poder realizar la unión. Me pregunto por qué has rechazado esta respuesta. Y el diagrama de Venn es la fuente para explicar cómo funciona SQL JOIN. ¿Tienes mejores ejemplos para representar las uniones? Si no es así, por favor, vota para que las personas obtengan mejores soluciones. Gracias.
Mayur

Eres el que pone los diagramas en la publicación. ¿Cuál es la leyenda de los diagramas? ¿Cuáles son los elementos de cada conjunto? ¿Y qué hay del hecho de que las mesas son bolsas, no juegos? No dices Una cosa de la que no son conjuntos es de filas de A y B según las etiquetas. Vea mis comentarios en las publicaciones de esta página. Esta publicación solo repite ciegamente el uso incorrecto visto en otros lugares pero no entendido o cuestionado. Además, las cosas que dice en el texto aquí no son claras y están equivocadas. Además, no agrega nada a las muchas respuestas que ya están aquí. (A pesar de que casi todos son bastante pobres). PD: Por favor aclare a través de ediciones, no comentarios.
philipxy

Los FK no son necesarios para unirse o consultar. Se pueden unir 2 tablas en cualquier condición que involucre sus columnas e independientemente de cualquier restricción, desencadenante o afirmación.
Filipinas

3
  • 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


1
Esto es a la vez incorrecto y poco claro. Unir no es una intersección a menos que las tablas tengan las mismas columnas. Las uniones externas no tienen filas de A o B a menos que tengan las mismas columnas, en cuyo caso no se agregan valores nulos. Estás tratando de decir algo, pero no lo estás diciendo. No estás explicando correcta o claramente.
philipxy

@philipxy: No estuvo de acuerdo con su declaración Join is not an intersection unless the tables have the same columnsNo. Puede unir las columnas que desee y si el valor coincide, se unirán.
SuicideSheep

Ese comentario no es tan claro como su respuesta. (Supongo que podría estar pensando en algo como, el conjunto de valores subrow para las columnas comunes del resultado es la intersección de los conjuntos de valores subrow para las columnas comunes de cada una de las entradas; pero eso no es lo que ha escrito. no están claros.)
philipxy

Lo que quise decir es que la unión es solo una intersección de entradas cuando es una unión interna natural de entradas con las mismas columnas. Estás usando las palabras "intersección" y "unión" incorrectamente.
philipxy

3

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

salida1

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

salida2

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.

Uniones

Ventajas de las uniones

  1. Se ejecuta más rápido.

2
Esto solo es correcto cuando las tablas tienen el mismo conjunto de columnas. (Confunde la unión interna con la intersección y la unión completa con la unión). Además, "coincidencia" no está definido. Lee mis otros comentarios.
philipxy

2

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

Unir internamente:

Principalmente escrito como solo ÚNETE en consultas SQL. Solo devuelve los registros coincidentes entre las tablas.

Averigüe 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 puede ver arriba, Joseno se imprime desde EMP en la salida ya que dept_id 6no encuentra una coincidencia en la tabla Departamento. Del mismo modo, HRy las R&Dfilas 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.

IZQUIERDA UNIRSE:

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.

HRy las R&Dfilas 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í .


2

La idea general

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 JOINy LEFT OUTER JOIN.

Estas dos tablas forman una base para la representación de las JOINsiguientes s:

Base

UNIÓN CRUZADA

CrossJoin

SELECT *
  FROM citizen
 CROSS JOIN postalcode

El resultado serán los productos cartesianos de todas las combinaciones. No se JOINrequiere condición:

CrossJoinResult

UNIR INTERNAMENTE

INNER JOIN es lo mismo que simplemente: JOIN

Unir internamente

SELECT *
  FROM citizen    c
  JOIN postalcode p ON c.postal = p.postal

El resultado serán combinaciones que satisfagan la JOINcondición requerida :

InnerJoinResult

IZQUIERDA COMBINACIÓN EXTERNA

LEFT OUTER JOIN es lo mismo que LEFT JOIN

LeftJoin

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal

El resultado será todo, citizenincluso si no hay coincidencias postalcode. Nuevamente JOINse requiere una condición:

LeftJoinResult

Datos para jugar

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;

Límites borrosos al jugar con JOINyWHERE

UNIÓN CRUZADA

CROSS JOINresultando 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 JOINpara obtener el resultado de un LEFT OUTER JOINrequiere trucos como agregar en una NULLfila. Se omite

UNIR INTERNAMENTE

INNER JOINse 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 JOINpara obtener el resultado de a LEFT OUTER JOINtambién requiere trucos. Se omite

IZQUIERDA COMBINACIÓN EXTERNA

LEFT JOINda 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 JOINda 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

Los problemas con el diagrama de Venn

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 Arepresenta el conjunto de la izquierda (la citizentabla) y el conjunto Bes el conjunto de la derecha (la postalcodetabla) en la discusión a continuación.

UNIÓN CRUZADA

Cada elemento en ambos conjuntos se corresponde con cada elemento en el otro conjunto, lo que significa que necesitamos la Acantidad de cada Belemento y la Bcantidad de cada Aelemento 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 UNIONes de 7 filas en total. Pero son incompatibles para un SQLconjunto de resultados común . Y no es así como CROSS JOINfunciona en absoluto:

CrossJoinUnion1

Intentando representarlo así:

CrossJoinUnion2Crossing

.. pero ahora solo parece un INTERSECTION, que ciertamente no lo es . Además, no hay ningún elemento en el INTERSECTIONque esté realmente en ninguno de los dos conjuntos distintos. Sin embargo, se parece mucho a los resultados de búsqueda similares a este:

CrossJoinUnionUnion3

Como referencia, CROSS JOINse puede ver un resultado de búsqueda para s en Tutorialgateway . El INTERSECTION, al igual que este, está vacío.

UNIR INTERNAMENTE

El valor de un elemento depende de la JOINcondición. Es posible representar esto bajo la condición de que cada fila se vuelva única para esa condición. El significado id=xsolo 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 JOINcondició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 JOINcondición determina la ubicación de un elemento en el diagrama. Mirando solo los valores de la JOINcondición con el resto de la fila a lo largo del recorrido:

InnerJoinIntersection - Filled

Esta representación se desmorona por completo cuando se usa un INNER JOINcon una ON 1 = 1condició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 Ay Bno es muy adecuado. Por ejemplo, un auto común JOINcondición que hace que un elemento en Aque se emparejan a diferente elemento en B se ON A.parent = B.child, haciendo que el partido de Aque Ben elementos separados. De los ejemplos que serían SQLasí:

SELECT *
  FROM citizen c1
  JOIN citizen c2 ON c1.id = c2.leader

SelfJoinResult

Lo que significa que Smith es el líder de Green y Jensen.

ÚNETE EXTERIOR

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 JOINpuede pensar que coincide con el conjunto vacío. Pero en la teoría de conjuntos, la unión de cualquier conjunto Cy un conjunto vacío siempre es justa C. El conjunto vacío no agrega nada. La representación de esto LEFT OUTER JOINgeneralmente solo muestra todo Apara ilustrar que las filas Ase 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:

LeftJoinIntersection - Relleno

Cláusula WHERE: tiene sentido

Encontrar todas las filas de a CROSS JOINcon Smith y código postal en la Luna:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   AND p.area = 'Moon';

Donde - resultado

Ahora el diagrama de Venn no se usa para reflejar el JOIN. Se usa solo para la WHEREcláusula:

Dónde

..y eso tiene sentido.

Cuando INTERSECT y UNION tienen sentido

INTERSECARSE

Como se explicó, an INNER JOINno es realmente un INTERSECT. Sin embargo, INTERSECTs 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 SQLdará 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';

UNIÓN

An OUTER JOINno es un UNION. Sin embargo, UNIONtrabaje en las mismas condiciones que INTERSECT, dando como resultado un retorno de todos los resultados combinando ambos SELECTs:

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:

Unión - Resultado

También aquí tiene sentido un diagrama de Venn:

UNIÓN

Cuando no aplica

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


1

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 JOINse reducen a dos casos:

Para un SELECTsubconjunto de datos A:

  • use INNER JOINcuando los datos relacionados Bque busca DEBEN existir por diseño de base de datos;
  • utilícelo LEFT JOINcuando los datos relacionados Bque busca PODRÍAN o NO PODRÍAN existir por diseño de base de datos.

1

La diferencia entre inner joiny outer joines la siguiente:

  1. Inner joines una combinación que combina tablas basadas en tuplas coincidentes, mientras que outer joines una combinación que combina tablas basadas en tuplas coincidentes y no coincidentes.
  2. Inner joincombina filas coincidentes de dos tablas en las que se omiten filas no coincidentes, mientras que las outer joinfilas combinadas de dos tablas y las filas no coincidentes se llenan con un valor nulo.
  3. Inner joines como una operación de intersección, mientras que outer joines como una operación de unión.
  4. Inner joinson dos tipos, mientras que outer joinson tres tipos.
  5. outer joines más rápido que inner join.

1
Un resultado de unión externa es lo mismo que la unión interna, pero además de algunas filas adicionales, así que no tengo idea de por qué crees que la unión externa sería más rápida. Además, ¿cuáles son estos "dos tipos" de unión interna? ¿Supongo que te refieres a full, left y right para exterior?
Martin Smith

1
@ M.achaibou No realice modificaciones que hagan cambios de formato innecesarios. Los nombres de los operadores no son código a menos que se usen en código. No realice cambios en el significado de la publicación, publique un comentario al autor. Si no tiene el representante, espere hasta que lo tenga. Sucede que el póster aprobó esto, pero no realice tales modificaciones. La unión externa PS no es más rápida que la unión interna.
Filipinas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.