Unirse (SQL)

Una cláusula join en el lenguaje de consulta estructurado (SQL) combina columnas de una o más tablas en una nueva tabla. La operación corresponde a una operación de unión en álgebra relacional. De manera informal, una unión une dos tablas y coloca en la misma fila registros con campos coincidentes: INNER
, LEFT OUTER
, RIGHT OUTER
, EXTERIOR COMPLETO
y CRUZ
.
Tablas de ejemplo
Para explicar los tipos de unión, el resto de este artículo utiliza las siguientes tablas:
LastName | DepartmentID |
---|---|
Rafferty | 31 |
Jones | 33 |
Heisenberg | 33 |
Robinson | 34 |
Smith | 34 |
Williams | NULL |
DepartmentID | DepartmentName |
---|---|
31 | Ventas |
33 | Ingeniería |
34 | Clerical |
35 | Marketing |
Department.DepartmentID
es la clave principal de la tabla Department
, mientras que Employee.DepartmentID
es una clave externa.
Tenga en cuenta que en Empleado
, "Williams" Aún no ha sido asignado a ningún departamento. Además, no se ha asignado ningún empleado al área de "Marketing" departamento.
Estas son las declaraciones SQL para crear las tablas anteriores:
CREATE CUADRO Departamento() DepartmentID INT PRIMARÍA KEY NO NULL, DepartmentName VARCHAR()20));CREATE CUADRO empleado () LastName VARCHAR()20), DepartmentID INT REFERENCIAS Departamento()DepartmentID));INSERT INTO DepartamentoVALUES ()31, "Ventas" '), ()33, Engineering '), ()34, 'Clerical' '), ()35, 'Marketing ');INSERT INTO empleadoVALUES ()"Rafferty" ', 31), ()'Jones ', 33), ()Heisenberg ', 33), ()'Robinson ', 34), ()'Smith ', 34), ()'Williams ', NULL);
Cross Join
CROSS JOIN
devuelve el producto cartesiano de filas de tablas en la unión. En otras palabras, producirá filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla.
Empleado. | Empleado.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Rafferty | 31 | Ventas | 31 |
Jones | 33 | Ventas | 31 |
Heisenberg | 33 | Ventas | 31 |
Smith | 34 | Ventas | 31 |
Robinson | 34 | Ventas | 31 |
Williams | NULL | Ventas | 31 |
Rafferty | 31 | Ingeniería | 33 |
Jones | 33 | Ingeniería | 33 |
Heisenberg | 33 | Ingeniería | 33 |
Smith | 34 | Ingeniería | 33 |
Robinson | 34 | Ingeniería | 33 |
Williams | NULL | Ingeniería | 33 |
Rafferty | 31 | Clerical | 34 |
Jones | 33 | Clerical | 34 |
Heisenberg | 33 | Clerical | 34 |
Smith | 34 | Clerical | 34 |
Robinson | 34 | Clerical | 34 |
Williams | NULL | Clerical | 34 |
Rafferty | 31 | Marketing | 35 |
Jones | 33 | Marketing | 35 |
Heisenberg | 33 | Marketing | 35 |
Smith | 34 | Marketing | 35 |
Robinson | 34 | Marketing | 35 |
Williams | NULL | Marketing | 35 |
Ejemplo de una unión cruzada explícita:
SELECT *DESDE empleado CROSS Únete Departamento;
Ejemplo de unión cruzada implícita:
SELECT *DESDE empleado, Departamento;
La unión cruzada se puede reemplazar con una unión interna con una condición siempre verdadera:
SELECT *DESDE empleado INNER Únete Departamento ON 1=1;
CROSS JOIN
no aplica ningún predicado para filtrar filas de la tabla unida. Los resultados de una CROSS JOIN
se pueden filtrar usando una cláusula WHERE, que luego puede producir el equivalente de una unión interna.
En el estándar SQL:2011, las uniones cruzadas son parte del paquete opcional F401, "Tabla unida extendida".
Los usos normales son para comprobar el rendimiento del servidor.
Unión interna
Una unión interna (o unión) requiere que cada fila de las dos tablas unidas tenga valores de columna coincidentes, y es una operación de unión comúnmente utilizada en aplicaciones, pero no debería Se supone que es la mejor opción en todas las situaciones. La combinación interna crea una nueva tabla de resultados combinando los valores de las columnas de dos tablas (A y B) según el predicado de la combinación. La consulta compara cada fila de A con cada fila de B para encontrar todos los pares de filas que satisfacen el predicado de unión. Cuando el predicado de unión se satisface al hacer coincidir valores no NULL, los valores de columna para cada par de filas coincidentes de A y B se combinan en una fila de resultado.
El resultado de la unión se puede definir como el resultado de tomar primero el producto cartesiano (o unión cruzada) de todas las filas de las tablas (combinando cada fila de la tabla A con cada fila de la tabla B) y luego devolver todas las filas. que satisfacen el predicado de unión. Las implementaciones reales de SQL normalmente utilizan otros enfoques, como uniones hash o uniones tipo-fusión, ya que calcular el producto cartesiano es más lento y a menudo requeriría una cantidad prohibitiva de memoria para almacenar.
SQL especifica dos formas sintácticas diferentes de expresar uniones: la "notación de unión explícita" y la "notación de unión implícita". La "notación de unión implícita" Ya no se considera una mejor práctica, aunque los sistemas de bases de datos todavía lo admiten.
La "notación de unión explícita" utiliza la palabra clave JOIN
, opcionalmente precedida por la palabra clave INNER
, para especificar la tabla a unir, y la palabra clave ON
para especificar los predicados para la tabla. unirse, como en el siguiente ejemplo:
SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentName DESDE empleado INNER Únete Departamento ONempleado.DepartmentID = Departamento.DepartmentID;
Empleado. | Empleado.DepartmentID | Department.DepartmentName |
---|---|---|
Robinson | 34 | Clerical |
Jones | 33 | Ingeniería |
Smith | 34 | Clerical |
Heisenberg | 33 | Ingeniería |
Rafferty | 31 | Ventas |
La "notación de unión implícita" simplemente enumera las tablas para unir, en la cláusula FROM
de la instrucción SELECT
, usando comas para separarlas. Por lo tanto, especifica una unión cruzada, y la cláusula WHERE
puede aplicar predicados de filtro adicionales (que funcionan de manera comparable a los predicados de unión en la notación explícita).
El siguiente ejemplo es equivalente al anterior, pero esta vez usando notación de unión implícita:
SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentName DESDE empleado, DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID;
Las consultas dadas en los ejemplos anteriores unirán las tablas de Empleados y departamentos usando la columna ID de Departamento de ambas tablas. Cuando el ID de departamento de estas tablas coincide (es decir, se cumple el predicado de unión), la consulta combinará las columnas Apellido, ID de departamento y Nombre de departamento de las dos tablas en una fila de resultados. Cuando el ID del departamento no coincide, no se genera ninguna fila de resultados.
Así el resultado de la ejecución de la consulta anterior será:
Empleado. | Empleado.DepartmentID | Department.DepartmentName |
---|---|---|
Robinson | 34 | Clerical |
Jones | 33 | Ingeniería |
Smith | 34 | Clerical |
Heisenberg | 33 | Ingeniería |
Rafferty | 31 | Ventas |
El empleado "Williams" y el departamento "Marketing" no aparecen en los resultados de ejecución de la consulta. Ninguno de estos tiene filas coincidentes en la otra tabla respectiva: "Williams" no tiene ningún departamento asociado y ningún empleado tiene el ID de departamento 35 ("Marketing"). Dependiendo de los resultados deseados, este comportamiento puede ser un error sutil, que se puede evitar reemplazando la unión interna por una unión externa.
Unión interna y valores NULL
Los programadores deben tener especial cuidado al unir tablas en columnas que pueden contener valores NULL, ya que NULL nunca coincidirá con ningún otro valor (ni siquiera el propio NULL), a menos que la condición de unión utilice explícitamente un predicado de combinación que primero verifique que las columnas se unan. son NOT NULL
antes de aplicar las condiciones de predicado restantes. La unión interna solo se puede utilizar de forma segura en una base de datos que aplique integridad referencial o donde se garantice que las columnas de unión no serán NULL. Muchas bases de datos relacionales de procesamiento de transacciones se basan en estándares de actualización de datos de atomicidad, coherencia, aislamiento y durabilidad (ACID) para garantizar la integridad de los datos, lo que hace que las uniones internas sean una opción adecuada. Sin embargo, las bases de datos de transacciones generalmente también tienen columnas de unión deseables que pueden ser NULL. Muchas bases de datos relacionales y almacenes de datos de informes utilizan actualizaciones por lotes de extracción, transformación y carga (ETL) de gran volumen que hacen que la integridad referencial sea difícil o imposible de aplicar, lo que da como resultado columnas de unión potencialmente NULL que un autor de una consulta SQL no puede modificar y que provocan que se omitan las uniones internas. datos sin indicación de error. La elección de utilizar una combinación interna depende del diseño de la base de datos y de las características de los datos. Una combinación externa izquierda generalmente se puede sustituir por una combinación interna cuando las columnas de combinación en una tabla pueden contener valores NULL.
Cualquier columna de datos que pueda ser NULL (vacía) nunca debe usarse como enlace en una combinación interna, a menos que el resultado deseado sea eliminar las filas con el valor NULL. Si las columnas de unión NULL se van a eliminar deliberadamente del conjunto de resultados, una unión interna puede ser más rápida que una unión externa porque la unión de la tabla y el filtrado se realizan en un solo paso. Por el contrario, una unión interna puede provocar un rendimiento desastrosamente lento o incluso una caída del servidor cuando se utiliza en una consulta de gran volumen en combinación con funciones de base de datos en una cláusula Where de SQL. Una función en una cláusula Where de SQL puede hacer que la base de datos ignore índices de tablas relativamente compactos. La base de datos puede leer y unir internamente las columnas seleccionadas de ambas tablas antes de reducir el número de filas usando el filtro que depende de un valor calculado, lo que resulta en una cantidad relativamente enorme de procesamiento ineficiente.
Cuando se produce un conjunto de resultados uniendo varias tablas, incluidas las tablas maestras utilizadas para buscar descripciones de texto completo de códigos de identificación numéricos (una tabla de búsqueda), un valor NULL en cualquiera de las claves foráneas puede dar como resultado el resultado completo. La fila se elimina del conjunto de resultados, sin indicación de error. Una consulta SQL compleja que incluye una o más combinaciones internas y varias combinaciones externas tiene el mismo riesgo de valores NULL en las columnas de enlace de combinación interna.
Un compromiso con el código SQL que contiene combinaciones internas supone que las columnas de combinación NULL no se introducirán en cambios futuros, incluidas actualizaciones de proveedores, cambios de diseño y procesamiento masivo fuera de las reglas de validación de datos de la aplicación, como conversiones de datos, migraciones, importaciones masivas y fusiones.
Se pueden clasificar además las uniones internas como uniones equiuniones, uniones naturales o uniones cruzadas.
Equi-unión
Una equi-join es un tipo específico de unión basada en comparador, que utiliza solo comparaciones de igualdad en el predicado de unión. El uso de otros operadores de comparación (como <
) descalifica una unión como equi-unión. La consulta que se muestra arriba ya ha proporcionado un ejemplo de unión equivalente:
SELECT *DESDE empleado Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
Podemos escribir equi-join como abajo,
SELECT *DESDE empleado, DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID;
Si las columnas de una combinación equi tienen el mismo nombre, SQL-92 proporciona una notación abreviada opcional para expresar combinaciones equi, mediante la construcción USING
:
SELECT *DESDE empleado INNER Únete Departamento Uso ()DepartmentID);
Sin embargo, la construcción USING
es más que un mero azúcar sintáctico, ya que el conjunto de resultados difiere del conjunto de resultados de la versión con el predicado explícito. Específicamente, cualquier columna mencionada en la lista USING
aparecerá solo una vez, con un nombre no calificado, en lugar de una vez para cada tabla de la combinación. En el caso anterior, habrá una única columna DepartmentID
y ninguna employee.DepartmentID
o department.DepartmentID
.
La cláusula USING
no es compatible con MS SQL Server y Sybase.
Unión natural
La unión natural es un caso especial de unión equi. La unión natural (⋈) es un operador binario que se escribe como (R ⋈ S) donde R y S son relaciones. El resultado de la unión natural es el conjunto de todas las combinaciones de tuplas en R y S que son iguales en sus nombres de atributos comunes. Como ejemplo, considere las tablas Empleado y Depto y su unión natural:
|
|
|
Esto también se puede utilizar para definir la composición de las relaciones. Por ejemplo, la composición de Empleado y Depto es su unión como se muestra arriba, proyectada en todos menos en el atributo común DeptName. En la teoría de categorías, la unión es precisamente el producto de fibra.
La unión natural es posiblemente uno de los operadores más importantes ya que es la contraparte relacional del AND lógico. Tenga en cuenta que si la misma variable aparece en cada uno de dos predicados conectados por AND, entonces esa variable representa lo mismo y ambas apariciones siempre deben sustituirse por el mismo valor. En particular, la unión natural permite la combinación de relaciones que están asociadas mediante una clave foránea. Por ejemplo, en el ejemplo anterior una clave externa probablemente va desde Empleado.DeptName hasta Dept.DeptName y luego la unión natural de Empleado y Depto combina a todos los empleados con sus departamentos. Esto funciona porque la clave externa se mantiene entre atributos con el mismo nombre. Si este no es el caso, como en la clave externa de Depto.gerente a Empleado.Nombre, entonces estos Es necesario cambiar el nombre de las columnas antes de realizar la unión natural. A veces, esta combinación también se denomina equi-unión.
Más formalmente, la semántica de la unión natural se define de la siguiente manera:
- R⋈ ⋈ S={}t∪ ∪ s▪ ▪ t▪ ▪ R ∧ ∧ s▪ ▪ S ∧ ∧ Fun()t∪ ∪ s)}{displaystyle Rbowtie S=left{tcup smid tin R\\land sin S\\land {mathit {fn}(tcup s)right},
donde Fun es un predicado que es verdadero para una relación r si y sólo si r es una función. Generalmente se requiere que R y S tengan al menos un atributo común, pero si se omite esta restricción, R y S no tienen atributos comunes, entonces la unión natural se convierte exactamente en el producto cartesiano.
La unión natural se puede simular con las primitivas de Codd de la siguiente manera. Sean c1,..., cm los nombres de atributos comunes a R y S, r1,..., rn sean los nombres de atributos exclusivos de R y sean s1,..., sk sean los atributos exclusivos de S. Además, supongamos que los nombres de atributos x1,..., xm no están ni en R ni en S. En un primer paso, ahora se puede cambiar el nombre de los nombres de atributos comunes en S:
- T=*** *** x1/c1,... ... ,xm/cm()S)=*** *** x1/c1()*** *** x2/c2()... ... *** *** xm/cm()S)... ... )){displaystyle T=rho ¿Por qué? ¿Por qué? ¿Por qué? ¿Qué?
Luego tomamos el producto cartesiano y seleccionamos las tuplas que se van a unir:
- U=π π r1,... ... ,rn,c1,... ... ,cm,s1,... ... ,sk()P){displaystyle U=pi _{1},ldotsr_{n},c_{1},ldotsc_{m},s_{1},ldotss_{k}(P)}
Una unión natural es un tipo de equi-join donde el Únase predicar surge implícitamente comparando todas las columnas en ambas tablas que tienen los mismos nombres de columna en las tablas unidas. La tabla combinada resultante contiene sólo una columna para cada par de columnas igualmente llamadas. En el caso de que no se encuentren columnas con los mismos nombres, el resultado es una unión cruzada.
La mayoría de los expertos coinciden en que los NATURAL JOIN son peligrosos y, por lo tanto, desaconsejan su uso. El peligro proviene de agregar inadvertidamente una nueva columna, con el mismo nombre que otra columna de la otra tabla. Una unión natural existente podría entonces conectarse "naturalmente" use la nueva columna para comparaciones, haciendo comparaciones/coincidencias usando criterios diferentes (de diferentes columnas) que antes. Por lo tanto, una consulta existente podría producir resultados diferentes, incluso aunque los datos de las tablas no hayan sido modificados, sino sólo aumentados. El uso de nombres de columnas para determinar automáticamente los vínculos de las tablas no es una opción en bases de datos grandes con cientos o miles de tablas, donde impondría una restricción poco realista a las convenciones de nomenclatura. Las bases de datos del mundo real se diseñan comúnmente con datos de clave externa que no se completan de manera consistente (se permiten valores NULL), debido a las reglas comerciales y al contexto. Es una práctica común modificar los nombres de las columnas de datos similares en diferentes tablas y esta falta de coherencia rígida relega las uniones naturales a un concepto teórico de discusión.
La consulta de ejemplo anterior para uniones internas se puede expresar como una unión natural de la siguiente manera:
SELECT *DESDE empleado NATURAL Únete Departamento;
Al igual que con la cláusula USING
explícita, solo aparece una columna DepartmentID en la tabla unida, sin ningún calificador:
DepartmentID | Empleado. | Department.DepartmentName |
---|---|---|
34 | Smith | Clerical |
33 | Jones | Ingeniería |
34 | Robinson | Clerical |
33 | Heisenberg | Ingeniería |
31 | Rafferty | Ventas |
PostgreSQL, MySQL y Oracle admiten uniones naturales; Microsoft T-SQL e IBM DB2 no lo hacen. Las columnas utilizadas en la combinación son implícitas, por lo que el código de combinación no muestra qué columnas se esperan y un cambio en los nombres de las columnas puede cambiar los resultados. En el estándar SQL:2011, las uniones naturales forman parte del paquete opcional F401, "Tabla unida extendida".
En muchos entornos de bases de datos, los nombres de las columnas los controla un proveedor externo, no el desarrollador de la consulta. Una unión natural supone estabilidad y coherencia en los nombres de las columnas, que pueden cambiar durante las actualizaciones de versión exigidas por el proveedor.
Unión externa
La mesa unida conserva cada fila, incluso si no existe otra fila. Las uniones externas subdividen más adelante en las uniones exteriores izquierdas, las uniones externas derechas y las uniones externas completas, dependiendo de las filas de la mesa se conservan: izquierda, derecha o ambas (en este caso izquierda y derecho referencia a los dos lados de los JOIN
palabra clave). Como las uniones internas, se puede sub-categorizar más todo tipo de uniones externas como equi-joins, ensamblaciones naturales, ON
( θ-join), etc.
No existe ninguna notación de unión implícita para uniones externas en SQL estándar.

Unión exterior izquierda
El resultado de una unión externa izquierda (o simplemente una unión izquierda) para las tablas A y B siempre contiene todas las filas de la tabla "izquierda" tabla (A), incluso si la condición de unión no encuentra ninguna fila coincidente en la sección "derecha" tabla (B). Esto significa que si la cláusula ON
coincide con 0 (cero) filas en B (para una fila determinada en A), la unión aún devolverá una fila en el resultado (para esa fila), pero con NULL en cada columna de B. Una unión externa izquierda devuelve todos los valores de una unión interna más todos los valores de la tabla de la izquierda que no coinciden con la tabla de la derecha, incluidas las filas con valores NULL (vacíos) en la columna de enlace.
Por ejemplo, esto nos permite encontrar el departamento de un empleado, pero aún muestra los empleados que no han sido asignados a un departamento (a diferencia del ejemplo de unión interna anterior, donde los empleados no asignados fueron excluidos del resultado). .
Ejemplo de una unión externa izquierda (la palabra clave OUTER
es opcional), con la fila de resultado adicional (en comparación con la unión interna) en cursiva:
SELECT *DESDE empleado LEFT Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
Empleado. | Empleado.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Jones | 33 | Ingeniería | 33 |
Rafferty | 31 | Ventas | 31 |
Robinson | 34 | Clerical | 34 |
Smith | 34 | Clerical | 34 |
Williams | NULL | NULL | NULL |
Heisenberg | 33 | Ingeniería | 33 |
Sintaxis alternativas
Oracle admite la sintaxis obsoleta:
SELECT *DESDE empleado, DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID()+)
Sybase admite la sintaxis (Microsoft SQL Server desaprobó esta sintaxis desde la versión 2000):
SELECT *DESDE empleado, DepartamentoDonde empleado.DepartmentID *= Departamento.DepartmentID
IBM Informix soporta la sintaxis:
SELECT *DESDE empleado, Fuera DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID

Unión exterior derecha
A derecho exterior (o derecho a unirse) se asemeja estrechamente a una unión externa izquierda, excepto con el tratamiento de las tablas invertidas. Cada fila de la tabla "derecha" (B) aparecerá en la tabla unida al menos una vez. Si no existe una fila de la tabla "izquierda" (A), NULL aparecerá en columnas de A para aquellas filas que no tienen partido en B.
Una combinación externa derecha devuelve todos los valores de la tabla derecha y los valores coincidentes de la tabla izquierda (NULL en el caso de que no haya un predicado de combinación coincidente). Por ejemplo, esto nos permite encontrar cada empleado y su departamento, pero aún así mostrar los departamentos que no tienen empleados.
A continuación se muestra un ejemplo de una unión externa derecha (la palabra clave OUTER
es opcional), con la fila de resultados adicional en cursiva:
SELECT *DESDE empleado Bien. Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
Empleado. | Empleado.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Smith | 34 | Clerical | 34 |
Jones | 33 | Ingeniería | 33 |
Robinson | 34 | Clerical | 34 |
Heisenberg | 33 | Ingeniería | 33 |
Rafferty | 31 | Ventas | 31 |
NULL | NULL | Marketing | 35 |
Las uniones exteriores derecha e izquierda son funcionalmente equivalentes. Ninguno proporciona ninguna funcionalidad que el otro no ofrece, por lo que las uniones externas derecha e izquierda pueden reemplazarse entre sí siempre que se cambie el orden de la tabla.

Unión externa completa
Conceptualmente, una unión exterior completa combina el efecto de aplicar uniones exteriores izquierda y derecha. Cuando las filas de las tablas unidas externas completas no coinciden, el conjunto de resultados tendrá valores NULL para cada columna de la tabla que carezca de una fila coincidente. Para aquellas filas que coincidan, se generará una sola fila en el conjunto de resultados (que contiene columnas completadas de ambas tablas).
Por ejemplo, esto nos permite ver cada empleado que está en un departamento y cada departamento que tiene un empleado, pero también ver cada empleado que no es parte de un departamento y cada departamento que no tiene un empleado. .
Ejemplo de una unión externa completa (la palabra clave OUTER
es opcional):
SELECT *DESDE empleado FULL Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
Empleado. | Empleado.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Smith | 34 | Clerical | 34 |
Jones | 33 | Ingeniería | 33 |
Robinson | 34 | Clerical | 34 |
Williams | NULL | NULL | NULL |
Heisenberg | 33 | Ingeniería | 33 |
Rafferty | 31 | Ventas | 31 |
NULL | NULL | Marketing | 35 |
Algunos sistemas de bases de datos no admiten la funcionalidad completa de combinación externa directamente, pero pueden emularla mediante el uso de una combinación interna y UNION ALL selecciona las "filas de tabla únicas" de las tablas izquierda y derecha respectivamente. El mismo ejemplo puede aparecer de la siguiente manera:
SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentName, Departamento.DepartmentIDDESDE empleadoINNER Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentIDUNION TODOSSELECT empleado.LastName, empleado.DepartmentID, fundición()NULL como varchar()20)), fundición()NULL como entero)DESDE empleadoDonde NO EXISTAS () SELECT * DESDE Departamento Donde empleado.DepartmentID = Departamento.DepartmentID)UNION TODOSSELECT fundición()NULL como varchar()20)), fundición()NULL como entero), Departamento.DepartmentName, Departamento.DepartmentIDDESDE DepartamentoDonde NO EXISTAS () SELECT * DESDE empleado Donde empleado.DepartmentID = Departamento.DepartmentID)
Otro enfoque podría ser UNION TODAS las combinaciones externas izquierda y derecha MENOS la combinación interna.
Autounirse
Una autounión es unir una mesa a sí misma.
Ejemplo
Si hubiera dos tablas separadas para empleados y una consulta que solicitara que los empleados de la primera tabla tuvieran el mismo país que los empleados de la segunda tabla, se podría utilizar una operación de combinación normal para encontrar la tabla de respuestas. Sin embargo, toda la información de los empleados está contenida en una única tabla grande.
Considere una tabla Empleado
modificada como la siguiente:
EmployeeID | LastName | País | DepartmentID |
---|---|---|---|
123 | Rafferty | Australia | 31 |
124 | Jones | Australia | 33 |
145 | Heisenberg | Australia | 33 |
201 | Robinson | Estados Unidos | 34 |
305 | Smith | Alemania | 34 |
306 | Williams | Alemania | NULL |
Un ejemplo de consulta de solución podría ser el siguiente:
SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.PaísDESDE Employee F INNER Únete Employee S ON F.País = S.PaísDonde F.EmployeeID c) S.EmployeeIDORDER BY F.EmployeeID, S.EmployeeID;
Lo que da como resultado que se genere la siguiente tabla.
EmployeeID | LastName | EmployeeID | LastName | País |
---|---|---|---|---|
123 | Rafferty | 124 | Jones | Australia |
123 | Rafferty | 145 | Heisenberg | Australia |
124 | Jones | 145 | Heisenberg | Australia |
305 | Smith | 306 | Williams | Alemania |
Para este ejemplo:
F
yS
son alias para la primera y segunda copia de la tabla de empleados.- La condición
F.Country = S.Country
excluye los emparejamientos entre empleados en diferentes países. La pregunta de ejemplo sólo quería pares de empleados en el mismo país. - La condición
F.EmployeeID < S.EmployeeID
excluye los emparejamientos donde elEmployeeID
del primer empleado es mayor o igual alEmployeeID
del segundo empleado. En otras palabras, el efecto de esta condición es excluir pares duplicados y auto-pairings. Sin ella, se generaría la siguiente tabla menos útil (la tabla siguiente muestra sólo la parte "Alemania" del resultado):
EmployeeID | LastName | EmployeeID | LastName | País |
---|---|---|---|---|
305 | Smith | 305 | Smith | Alemania |
305 | Smith | 306 | Williams | Alemania |
306 | Williams | 305 | Smith | Alemania |
306 | Williams | 306 | Williams | Alemania |
Solo se necesita uno de los dos pares del medio para satisfacer la pregunta original, y el superior y el inferior no tienen ningún interés en este ejemplo.
Alternativas
El efecto de una unión externa también se puede obtener usando UNION ALL entre una INNER JOIN y un SELECT de las filas en el archivo "principal" tabla que no cumple la condición de unión. Por ejemplo,
SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentNameDESDE empleadoLEFT Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
también se puede escribir como
SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentNameDESDE empleadoINNER Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentIDUNION TODOSSELECT empleado.LastName, empleado.DepartmentID, fundición()NULL como varchar()20)DESDE empleadoDonde NO EXISTAS () SELECT * DESDE Departamento Donde empleado.DepartmentID = Departamento.DepartmentID)
Aplicación
Mucho trabajo en los sistemas de bases de datos ha tenido como objetivo la implementación eficiente de las uniones, ya que los sistemas relacionales comúnmente piden unirse, pero enfrentan dificultades para optimizar su ejecución eficiente. El problema surge porque las uniones internas operan de forma comunicativa y asociativa. En la práctica, esto significa que el usuario simplemente suministra la lista de tablas para unirse y las condiciones de unión a utilizar, y el sistema de bases de datos tiene la tarea de determinar la manera más eficiente de realizar la operación. Las opciones se vuelven más complejas a medida que aumenta el número de tablas involucradas en una consulta, cada tabla con características diferentes en el recuento de registros, longitud promedio de registro (considerando campos NULL) e índices disponibles. Donde los filtros de Clause también pueden impactar significativamente el volumen y el costo de las consultas.
Un optimizador de consultas determina cómo ejecutar una consulta que contiene combinaciones. Un optimizador de consultas tiene dos libertades básicas:
- Unirse al orden: Debido a que se une a funciones de forma comunicativa y asociativa, el orden en que el sistema se une a tablas no cambia el resultado final conjunto de la consulta. Sin embargo, orden de adhesión podría ser tener un enorme impacto en el costo de la operación de ensamblaje, por lo que elegir el mejor orden de ensamblaje se vuelve muy importante.
- Unirse al método: Dados dos tablas y una condición de unión, varios algoritmos pueden producir el conjunto de resultados de la unión. Que algoritmo funciona más eficientemente depende de los tamaños de las tablas de entrada, el número de filas de cada tabla que coinciden con la condición de unión, y las operaciones requeridas por el resto de la consulta.
Muchos algoritmos de unión tratan sus entradas de manera diferente. Se puede hacer referencia a las entradas de una combinación como entradas "externas" y "interno" unir operandos, o "izquierda" y "derecha", respectivamente. En el caso de bucles anidados, por ejemplo, el sistema de base de datos escaneará toda la relación interna en busca de cada fila de la relación externa.
Se pueden clasificar los planes de consulta que involucran uniones de la siguiente manera:
- izquierda
- utilizando una tabla base (más allá de otra unión) como el funcionamiento interno de cada uno se unen al plan
- derecha-deep
- utilizando una tabla base como el operario exterior de cada uno de ellos en el plan
- bushy
- ni izquierda ni derecha; ambas entradas a una unión pueden resultar de las uniones
Estos nombres se derivan de la aparición del plan de consulta si se dibuja como un árbol, con la relación de unión externa a la izquierda y la relación interior a la derecha (como dicta la convención).
Unir algoritmos

Existen tres algoritmos fundamentales para realizar una operación de unión binaria: unión de bucle anidado, unión de clasificación y fusión y unión hash. Los algoritmos de unión óptima en el peor de los casos son asintóticamente más rápidos que los algoritmos de unión binaria para uniones entre más de dos relaciones en el peor de los casos.
Unir índices
Los índices de unión son índices de bases de datos que facilitan el procesamiento de consultas de unión en almacenes de datos: actualmente (2012) están disponibles en implementaciones de Oracle y Teradata.
En la implementación de Teradata, las columnas especificadas, las funciones agregadas en columnas o los componentes de columnas de fecha de una o más tablas se especifican usando una sintaxis similar a la definición de una vista de base de datos: se pueden especificar hasta 64 columnas/expresiones de columna en un único índice de unión. Opcionalmente, también se puede especificar una columna que defina la clave principal de los datos compuestos: en hardware paralelo, los valores de la columna se utilizan para dividir el contenido del índice en varios discos. Cuando los usuarios actualizan las tablas de origen de forma interactiva, el contenido del índice de combinación se actualiza automáticamente. Cualquier consulta cuya cláusula WHERE especifique cualquier combinación de columnas o expresiones de columnas que sean un subconjunto exacto de las definidas en un índice de combinación (la llamada "consulta de cobertura") generará el índice de combinación, en lugar del original. tablas y sus índices, para ser consultados durante la ejecución de la consulta.
La implementación de Oracle se limita a utilizar índices de mapas de bits. Un índice de unión de mapa de bits se utiliza para columnas de baja cardinalidad (es decir, columnas que contienen menos de 300 valores distintos, según la documentación de Oracle): combina columnas de baja cardinalidad de múltiples tablas relacionadas. El ejemplo que utiliza Oracle es el de un sistema de inventario, donde diferentes proveedores proporcionan diferentes piezas. El esquema tiene tres tablas vinculadas: dos "tablas maestras", Pieza y Proveedor, y una "tabla de detalles", Inventario. La última es una tabla de muchos a muchos que vincula al proveedor con la pieza y contiene la mayor cantidad de filas. Cada pieza tiene un Tipo de pieza, cada proveedor tiene su sede en EE. UU. y tiene una columna de Estado. No hay más de 60 estados y territorios en los EE. UU. y no más de 300 tipos de piezas. El índice de unión de mapa de bits se define utilizando una unión estándar de tres tablas en las tres tablas anteriores y especificando las columnas Part_Type y Supplier_State para el índice. Sin embargo, está definido en la tabla Inventario, aunque las columnas Tipo_pieza y Estado_proveedor sean "prestadas" del Proveedor y Pieza respectivamente.
En cuanto a Teradata, un índice de unión de mapa de bits de Oracle solo se utiliza para responder una consulta cuando la cláusula WHERE de la consulta especifica columnas limitadas a aquellas que están incluidas en el índice de unión.
Unión directa
Algunos sistemas de bases de datos permiten al usuario forzar al sistema a leer las tablas en una combinación en un orden particular. Esto se utiliza cuando el optimizador de combinaciones elige leer las tablas en un orden ineficiente. Por ejemplo, en MySQL el comando STRAIGHT_JOIN
lee las tablas exactamente en el orden que figura en la consulta.
Contenido relacionado
Spl (Unix)
Encuadernación tardía
Tabla de métodos virtuales
ALGOL Y
Alma-0