También cómo hacerlo LEFT JOIN
, RIGHT JOIN
y FULL JOIN
en todo esto?
sql
database
join
inner-join
outer-join
Chris de Vries
fuente
fuente
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:
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.
Izquierda combinación externa
Una unión externa izquierda dará todas las filas en A, más cualquier fila común en B.
Unión exterior derecha
Una unión externa derecha dará todas las filas en B, más cualquier fila común en A.
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
fuente
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.
Explicación
Tablas de origen
Primero comience con un
CROSS JOIN
(Producto AKA Cartesiano). Esto no tiene unaON
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".
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.
Versión animada
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.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
NULL
valores para columnas de la derecha.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 tablaB
. 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 queNULL
se excluyan los valores para que este patrón funcione correctamente y evite simplemente recuperar las filas que tienen unNULL
valor para eso columna además de las filas no coincidentes.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.
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.
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=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.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 ALL
de las dos tablas.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
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
SELECCIONE A.Colour, B.Colour DESDE UNA IZQUIERDA EXTERIOR ÚNASE B EN A.Colour = B.Colour AND B.Colour = 'Green'
Violín de SQL
Vea estos ejemplos ejecutados en vivo en SQLFiddle.com .
fuente
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:
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:
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:
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.
Fuente de imagen
Manual de referencia de MySQL 8.0 - Sintaxis de unión
Operaciones de Oracle Join
fuente
Unir internamente
Recuperar las filas sólo comparable, es decir,
A intersect B
.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.
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.
Referencias
Ejemplos SQL internos y externos y el bloque Join
SQL: SE UNE
fuente
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
fuente
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.
fuente
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
solo devolverá los pedidos que también tengan algo en la tabla OrderDetails.
Si lo cambia a EXTERIOR IZQUIERDA UNIRSE
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
.fuente
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
aSELECT 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
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
Aquí, la tabla de empleados es la tabla maestra, phone_numbers_employees es la tabla secundaria (contiene
emp_id
una clave externa que conectaemployee.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:
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.
Uniones externas :
Diagramaticamente se ve así:
fuente
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 serLEFT
oRIGHT
.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.fuente
Esta es una buena explicación esquemática de todo tipo de uniones.
fuente: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
fuente
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
yLEFT 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
yRIGHT 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 deLEFT OUTER JOIN
yRIGHT OUTER JOIN
sin duplicación.fuente
La respuesta está en el significado de cada uno, así que en los resultados.
Mi respuesta se basa en la nota anterior .
Cuando tienes dos tablas como estas:
CROSS JOIN / OUTER JOIN:
puede tener todos los datos de esas tablas con
CROSS JOIN
o simplemente,
así: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 usarINNER JOIN
: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)
FULL OUTER JOIN:
cuando también desea tener todas las filas de la otra tabla en sus resultados, puede usar
FULL OUTER JOIN
:Bueno, según su necesidad, elija cada uno que cubra su necesidad;).
fuente
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).
fuente
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 queINNER JOIN
, pero también incluyeNULL
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 conNull
coincidencias.INNER JOIN
yOUTER JOIN
podemos escribir consultas de autounión.Por ejemplo:
fuente
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:
fuente
INNER JOIN
es más lento queLEFT JOIN
en la mayoría de las veces, y las personas pueden usar enLEFT JOIN
lugar deINNER JOIN
agregar unWHERE
para eliminarNULL
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 enOUTER JOIN
realidad es una unión en lugar de una unión:fuente
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) usandoNull
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.
fuente
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
fuente
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.
fuente
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:
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.
Resultado:
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
.Resultado:
Resultado:
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.
Resultado:
fuente
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
fuente
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:
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:
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
fuente
Considere a continuación 2 tablas:
EMP
Departamento
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:
Como puede ver arriba,
Jose
no se imprime desde EMP en la salida ya que dept_id6
no encuentra una coincidencia en la tabla Departamento. Del mismo modo,HR
y lasR&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.
IZQUIERDA UNIRSE:
Esto devuelve todos los registros de la tabla IZQUIERDA y solo los registros coincidentes de la tabla DERECHA.
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 lasR&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í .
fuente
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 JOIN
yLEFT OUTER JOIN
.Estas dos tablas forman una base para la representación de las
JOIN
siguientes s:UNIÓN CRUZADA
El resultado serán los productos cartesianos de todas las combinaciones. No se
JOIN
requiere condición:UNIR INTERNAMENTE
INNER JOIN
es lo mismo que simplemente:JOIN
El resultado serán combinaciones que satisfagan la
JOIN
condición requerida :IZQUIERDA COMBINACIÓN EXTERNA
LEFT OUTER JOIN
es lo mismo queLEFT JOIN
El resultado será todo,
citizen
incluso si no hay coincidenciaspostalcode
. NuevamenteJOIN
se requiere una condición: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.
Límites borrosos al jugar con
JOIN
yWHERE
UNIÓN CRUZADA
CROSS JOIN
resultando en filas como La idea general /INNER JOIN
:Usar
CROSS JOIN
para obtener el resultado de unLEFT OUTER JOIN
requiere trucos como agregar en unaNULL
fila. Se omiteUNIR INTERNAMENTE
INNER JOIN
se convierte en un producto cartesiano. Es lo mismo que La idea general /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 aLEFT OUTER JOIN
también requiere trucos. Se omiteIZQUIERDA COMBINACIÓN EXTERNA
LEFT JOIN
da como resultado filas como La idea general /CROSS JOIN
:LEFT JOIN
da como resultado filas como La idea general /INNER JOIN
: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
A
representa el conjunto de la izquierda (lacitizen
tabla) y el conjuntoB
es el conjunto de la derecha (lapostalcode
tabla) 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
A
cantidad de cadaB
elemento y laB
cantidad de cadaA
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 unSQL
conjunto de resultados común . Y no es así comoCROSS 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 elINTERSECTION
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 . ElINTERSECTION
, al igual que este, está vacío.UNIR INTERNAMENTE
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 significadoid=x
solo es cierto para una fila. Una vez que una fila en la tablaA
(citizen
) coincide con varias filas en la tablaB
(postalcode
) bajo laJOIN
condición, el resultado tiene los mismos problemas queCROSS 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 laJOIN
condición determina la ubicación de un elemento en el diagrama. Mirando solo los valores de laJOIN
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 unaON 1 = 1
condición que lo convierte en aCROSS JOIN
.Con un self
JOIN
, las filas son de hecho elementos idénticos en ambas tablas, pero representan las tablas como ambasA
yB
no es muy adecuado. Por ejemplo, un auto comúnJOIN
condición que hace que un elemento enA
que se emparejan a diferente elemento en B seON A.parent = B.child
, haciendo que el partido deA
queB
en elementos separados. De los ejemplos que seríanSQL
así: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 JOIN
puede pensar que coincide con el conjunto vacío. Pero en la teoría de conjuntos, la unión de cualquier conjuntoC
y un conjunto vacío siempre es justaC
. El conjunto vacío no agrega nada. La representación de estoLEFT OUTER JOIN
generalmente solo muestra todoA
para ilustrar que las filasA
se seleccionan independientemente de si hay una coincidencia o noB
. 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 aA
:Cláusula WHERE: tiene sentido
Encontrar todas las filas de a
CROSS JOIN
con Smith y código postal en la Luna:Ahora el diagrama de Venn no se usa para reflejar el
JOIN
. Se usa solo para laWHERE
cláusula:..y eso tiene sentido.
Cuando INTERSECT y UNION tienen sentido
INTERSECARSE
Como se explicó, an
INNER JOIN
no es realmente unINTERSECT
. 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. EstoSQL
dará como resultado la misma fila que la anteriorWHERE
, y el diagrama de Venn también será el mismo:UNIÓN
An
OUTER JOIN
no es unUNION
. Sin embargo,UNION
trabaje en las mismas condiciones queINTERSECT
, dando como resultado un retorno de todos los resultados combinando ambosSELECT
s:que es equivalente a:
..y da el resultado:
También aquí tiene sentido un diagrama de Venn:
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:
..intentando combinar los resultados con
UNION
da unPara 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
.fuente
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 datosA
:INNER JOIN
cuando los datos relacionadosB
que busca DEBEN existir por diseño de base de datos;LEFT JOIN
cuando los datos relacionadosB
que busca PODRÍAN o NO PODRÍAN existir por diseño de base de datos.fuente
La diferencia entre
inner join
youter join
es la siguiente:Inner join
es una combinación que combina tablas basadas en tuplas coincidentes, mientras queouter 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 lasouter 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 queouter join
es como una operación de unión.Inner join
son dos tipos, mientras queouter join
son tres tipos.outer join
es más rápido queinner join
.fuente