Articulo de referencia

Unir (SQL)

Un diagrama de Venn que representa la sentencia SQL de unión completa entre las tablas A y B. Una cláusula JOIN en el lenguaje de consulta estructurado ( SQL ) combina columnas ...

Un diagrama de Venn que representa la sentencia SQL de unión completa entre las tablas A y B.

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 JOIN en álgebra relacional . De manera informal, una JOIN une dos tablas y coloca en la misma fila registros con campos coincidentes. Hay varias variantes de JOIN JOIN: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, CROSS, y otras.

Tablas de ejemplo

Para explicar los tipos de unión, el resto de este artículo utiliza las siguientes tablas:

Department.DepartmentIDes la clave primaria de la Departmenttabla, mientras que Employee.DepartmentIDes una clave foránea .

Tenga en cuenta que en Employee, "Williams" aún no ha sido asignado a ningún departamento. Asimismo, ningún empleado ha sido asignado al departamento de "Marketing".

Estas son las sentencias SQL para crear las tablas anteriores:

CREAR TABLA departamento (DepartmentID INT CLAVE PRIMARIA NO NULO ,DepartamentoNombre VARCHAR ( 20 ));CREAR TABLA empleado (Apellido VARCHAR ( 20 ),DepartamentoID REFERENCIAS INT departamento ( DepartamentoID ));INSERTAR EN departamentoVALORES ( 31 , 'Ventas' ),( 33 , 'Ingeniería' ),( 34 , 'Clerical' ),( 35 , 'Marketing' );INSERTAR EN empleadoVALORES ( 'Rafferty' , 31 ),( 'Jones' , 33 ),( 'Heisenberg' , 33 ),( 'Robinson' , 34 ),( 'Smith' , 34 ),( 'Williams' , NULL );

unión cruzada

CROSS JOINDevuelve el producto cartesiano de las filas de las 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. [ 1 ]

Ejemplo de una unión cruzada explícita:

SELECCIONAR * DE empleado UNIÓN CRUZADA departamento ;

Ejemplo de una unión cruzada implícita:

SELECCIONAR * DE empleado , departamento ;

La unión transversal puede sustituirse por una unión interna con una condición siempre verdadera:

SELECCIONAR * DE empleado UNIÓN INTERNA departamento EN 1 = 1 ;

CROSS JOINNo aplica ningún predicado para filtrar filas de la tabla unida. Los resultados se CROSS JOINpueden filtrar usando una WHEREcláusula, lo que puede producir el equivalente a una unión interna.

En el estándar SQL:2011 , las combinaciones cruzadas forman parte del paquete opcional F401, "Tabla combinada extendida".

Su uso habitual es comprobar el rendimiento del servidor.

Unión interna

Una unión interna (o simplemente 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 debe considerarse la mejor opción en todas las situaciones. La unió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 unió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 mediante valores no nulos coincidentes , los valores de las columnas de cada par de filas coincidentes de A y B se combinan en una fila de resultados.

El resultado de la unión se define como 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, a continuación, devolviendo todas las filas que cumplen el predicado de unión. Las implementaciones SQL reales suelen utilizar otros enfoques, como las uniones hash o las uniones de ordenación y fusión , ya que calcular el producto cartesiano es más lento y, a menudo, requeriría una cantidad de memoria prohibitiva para su almacenamiento.

SQL especifica dos formas sintácticas diferentes para expresar las 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 buena práctica , aunque los sistemas de bases de datos aún la admiten.

La "notación de unión explícita" utiliza la JOINpalabra clave, opcionalmente precedida por la INNERpalabra clave, para especificar la tabla a unir, y la ONpalabra clave para especificar los predicados para la unión, como en el siguiente ejemplo:

SELECCIONAR empleado.Apellido , empleado.IDDepartamento , departamento.NombreDepartamento FROM empleado UNIÓN INTERNA departamento ON empleado.IDDepartamento = departamento.IDDepartamento ;

La notación de unión implícita simplemente enumera las tablas que se van a unir en la FROMcláusula de la SELECTinstrucción, separándolas con comas. De este modo, especifica una unión cruzada , y la WHEREcláusula puede aplicar predicados de filtro adicionales (que funcionan de forma comparable a los predicados de unión de la notación explícita).

El siguiente ejemplo es equivalente al anterior, pero esta vez utilizando la notación de unión implícita:

SELECCIONAR empleado.Apellido , empleado.IDDepartamento , departamento.NombreDepartamento DE empleado , departamento DONDE empleado.IDDepartamento = departamento.IDDepartamento ;

Las consultas de los ejemplos anteriores combinan las tablas Employee y Department utilizando la columna DepartmentID de ambas. Si el DepartmentID de estas tablas coincide (es decir, se cumple la condición de unión), la consulta combina las columnas LastName , DepartmentID y DepartmentName de ambas tablas en una fila de resultados. Si el DepartmentID no coincide, no se genera ninguna fila de resultados.

Por lo tanto, el resultado de la ejecución de la consulta anterior será:

El empleado "Williams" y el departamento "Marketing" no aparecen en los resultados de la consulta. Ninguno de ellos tiene filas coincidentes en la tabla correspondiente: "Williams" no tiene un departamento asociado, y ningún empleado tiene el ID de departamento 35 ("Marketing"). Dependiendo de los resultados deseados, este comportamiento podría 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 con NULL mismo), a menos que la condición de unión utilice explícitamente un predicado de combinación que primero verifique que las columnas de unión sean NULL NOT NULLantes de aplicar las condiciones de predicado restantes. La unión interna solo se puede usar de forma segura en una base de datos que garantice la integridad referencial o donde se garantice que las columnas de unión no sean NULL. Muchas bases de datos relacionales de procesamiento de transacciones se basan en los estándares de actualización de datos ACID ( atomicidad, consistencia, aislamiento, durabilidad ) para garantizar la integridad de los datos , lo que hace que las uniones internas sean una opción apropiada. Sin embargo, las bases de datos de transacciones también suelen tener columnas de unión deseables que pueden ser NULL. Muchas bases de datos relacionales de informes y almacenes de datos utilizan actualizaciones por lotes de extracción, transformación y carga (ETL) de alto volumen, lo que hace que la integridad referencial sea difícil o imposible de garantizar, lo que resulta en columnas de unión potencialmente NULL que un autor de consultas SQL no puede modificar y que hacen que las uniones internas omitan datos sin ninguna indicación de error. La elección de usar una unión interna depende del diseño de la base de datos y las características de los datos. Por lo general, se puede sustituir una unión externa izquierda por una unión interna cuando las columnas de unió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 unió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 tablas y el filtrado se hacen en un solo paso. Por el contrario, una unión interna puede resultar en un rendimiento desastrosamente lento o incluso un fallo del servidor cuando se usa en una consulta de gran volumen en combinación con funciones de base de datos en una cláusula WHERE de SQL. [ 2 ] [ 3 ] , [ 4 ] Una función en una cláusula WHERE de SQL puede hacer que la base de datos ignore índices de tabla 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 genera un conjunto de resultados mediante la unión de 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 provocar la eliminación de la fila completa del conjunto de resultados, sin ninguna indicación de error. Una consulta SQL compleja que incluya una o más uniones internas y varias uniones externas presenta el mismo riesgo de valores NULL en las columnas de enlace de la unión interna.

El compromiso con el código SQL que contiene uniones internas presupone que no se introducirán columnas de unión NULL debido a 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.

Además, las uniones internas se pueden clasificar como uniones equi-uniones y uniones theta (no equi-uniones).

Equi-join

La unión equi-join , también conocida como "la única operación elegible", es un tipo específico de unión basada en comparadores que utiliza únicamente comparaciones de igualdad en el predicado de unión. El uso de otros operadores de comparación (como <) invalida la condición de unión equi-join. La consulta mostrada anteriormente ya ha proporcionado un ejemplo de una unión equi-join:

SELECT * FROM employee JOIN department ON employee . DepartmentID = department . DepartmentID ;

Podemos escribir la unión equitativa como se muestra a continuación,

SELECCIONAR * DE empleado , departamento DONDE empleado.DepartamentoID = departamento.DepartamentoID ;

Si las columnas en una unión equitativa tienen el mismo nombre, SQL-92 proporciona una notación abreviada opcional para expresar uniones equitativa, a través de la USINGconstrucción: [ 5 ]

SELECT * FROM employee INNER JOIN department USING ( DepartmentID );

La USINGconstrucción es más que un simple 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 USINGlista aparecerá solo una vez, con un nombre no calificado, en lugar de una vez por cada tabla en la unión. En el caso anterior, habrá una sola DepartmentIDcolumna y ningún employee.DepartmentIDo department.DepartmentID.

Esta USINGcláusula no es compatible con MS SQL Server ni con Sybase.

Unión natural

La unión natural es un caso especial de la unión equitativa. La unión natural (⋈) es un operador binario que se escribe como ( RS ), donde R y S son relaciones . [ 6 ] 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. Por ejemplo, consideremos las tablas Employee y Dept y su unión natural:

Esto también se puede usar para definir la composición de relaciones . Por ejemplo, la composición de Empleado y Departamento es su unión como se muestra arriba, proyectada sobre todos excepto el atributo común NombreDepartamento . En la teoría de categorías , la unión es precisamente el producto fibrado .

La unión natural es, sin duda, uno de los operadores más importantes, ya que es el equivalente relacional del operador AND lógico. Cabe destacar que si la misma variable aparece en dos predicados conectados por AND, dicha variable representa lo mismo y ambas apariciones deben sustituirse siempre por el mismo valor. En particular, la unión natural permite combinar relaciones asociadas mediante una clave foránea . Por ejemplo, en el ejemplo anterior , probablemente exista una clave foránea entre Employee.DeptName y Dept.DeptName , y la unión natural de Employee y Dept combina a todos los empleados con sus departamentos. Esto funciona porque la clave foránea se establece entre atributos con el mismo nombre. Si este no es el caso , como en la clave foránea de Dept.Manager a Employee.Name , entonces estas columnas deben renombrarse antes de realizar la unión natural. Este tipo de unión también se conoce a veces como equi -join .

De forma más formal, la semántica de la unión natural se define de la siguiente manera:

RS={tstR  sS  Fnorte(ts)}{\displaystyle R\bowtie S=\left\{t\cup s\mid t\in R\ \land \ s\in S\ \land \ {\mathit {Fun}}(t\cup s)\right\}},

donde Fun es un predicado que es verdadero para una relación r si y solo 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 y 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 c 1 , ..., c m los nombres de los atributos comunes a R y S , r 1 , ..., r n los nombres de los atributos únicos de R y sean s 1 , ..., s k los atributos únicos de S . Además, supongamos que los nombres de los atributos x 1 , ..., x m no están ni en R ni en S . En un primer paso, los nombres de los atributos comunes en S se pueden renombrar:

T=ρincógnita1/do1,,incógnitametro/dometro(S)=ρincógnita1/do1(ρincógnita2/do2(ρincógnitametro/dometro(S))){\displaystyle T=\rho _{x_{1}/c_{1},\ldots ,x_{m}/c_{m}}(S)=\rho _{x_{1}/c_{1}}(\rho _{x_{2}/c_{2}}(\ldots \rho _{x_{m}/c_{m}}(S)\ldots ))}

Luego tomamos el producto cartesiano y seleccionamos las tuplas que se van a unir:

U=πr1,,rnorte,do1,,dometro,s1,,sk(PAG){\displaystyle U=\pi _{r_{1},\ldots ,r_{n},c_{1},\ldots ,c_{m},s_{1},\ldots ,s_{k}}(P)}

Una unión natural es un tipo de unión equitativa donde el predicado de unión surge implícitamente al comparar todas las columnas de ambas tablas que tienen los mismos nombres en las tablas unidas. La tabla resultante contiene solo una columna por cada par de columnas con el mismo nombre. En 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 las uniones naturales (NATURAL JOIN) son peligrosas y, por lo tanto, desaconsejan su uso. [ 7 ] El peligro radica en agregar inadvertidamente una nueva columna con el mismo nombre que otra columna en la otra tabla. Una unión natural existente podría entonces usar "naturalmente" la nueva columna para comparaciones, realizando comparaciones/coincidencias con criterios diferentes (de columnas diferentes) a los anteriores. Por lo tanto, una consulta existente podría producir resultados diferentes, aunque los datos en las tablas no se hayan modificado, sino solo aumentado. El uso de nombres de columna para determinar automáticamente los vínculos entre 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 suelen diseñarse con datos de clave externa que no se rellenan de forma consistente (se permiten valores NULL), debido a las reglas de negocio y al contexto. Es práctica común modificar los nombres de las columnas de datos similares en diferentes tablas, y esta falta de consistencia rígida relega las uniones naturales a un concepto teórico para debate.

La consulta de ejemplo anterior para uniones internas se puede expresar como una unión natural de la siguiente manera:

SELECCIONAR * DE empleado UNIÓN NATURAL departamento ;

Al igual que con la USINGcláusula explícita, solo aparece una columna DepartmentID en la tabla unida, sin ningún calificador:

PostgreSQL , MySQL y Oracle admiten uniones naturales; Microsoft T-SQL e IBM DB2 no. Las columnas utilizadas en la unión son implícitas, por lo que el código de unión no indica qué columnas se esperan, y un cambio en los nombres de las columnas puede modificar 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 presupone estabilidad y coherencia en los nombres de las columnas, los cuales pueden cambiar durante las actualizaciones de versión impuestas por el proveedor.

unión externa

La tabla unida conserva cada fila, incluso si no existe ninguna otra fila coincidente. Las uniones externas se subdividen a su vez en uniones externas izquierdas, uniones externas derechas y uniones externas completas, dependiendo de qué filas de la tabla se conservan: izquierda, derecha o ambas (en este caso, izquierda y derecha se refieren a los dos lados de la JOINpalabra clave). Al igual que las uniones internas , se pueden subcategorizar aún más todos los tipos de uniones externas como uniones equi-uniones , uniones naturales , ( unión θ ), etc. [ 8 ]ON<predicate>

En SQL estándar no existe una notación de unión implícita para las uniones externas.

Un diagrama de Venn que muestra el círculo izquierdo y la porción superpuesta rellena.
Diagrama de Venn que representa la sentencia SQL LEFT JOIN entre las tablas A y B.

unión exterior izquierda

El resultado de una unión externa izquierda (o simplemente unión izquierda ) para las tablas A y B siempre contiene todas las filas de la tabla "izquierda" (A), incluso si la condición de unión no encuentra ninguna fila coincidente en la tabla "derecha" (B). Esto significa que si la ONcláusula coincide con 0 (cero) filas en B (para una fila dada en A), la unió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 izquierda que no coinciden con la tabla 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 sigue mostrando a los empleados que no han sido asignados a un departamento (a diferencia del ejemplo de unión interna anterior, donde los empleados no asignados se excluían del resultado).

Ejemplo de una unión externa izquierda (la OUTERpalabra clave es opcional), con la fila de resultados adicional (en comparación con la unión interna) en cursiva:

SELECT * FROM employee LEFT OUTER JOIN department ON employee . DepartmentID = department . DepartmentID ;

Sintaxis alternativas

Oracle admite la sintaxis obsoleta [ 9 ] :

SELECCIONAR * DE empleado , departamento DONDE empleado.DepartamentoID = departamento.Departamento ( + )

Go2bank admite la sintaxis ( Microsoft SQL Server dejó de usar esta sintaxis desde la versión 2000):

SELECCIONAR * DE empleado , departamento DONDE empleado.Departamento * = departamento.DepartamentoID

IBM Informix admite la siguiente sintaxis:

SELECCIONAR * DE empleado , DEPARTAMENTO EXTERNO DONDE empleado.DepartamentoID = departamento.DepartamentoID
Un diagrama de Venn muestra el círculo derecho y las partes superpuestas rellenas.
Un diagrama de Venn que representa la sentencia SQL de unión correcta entre las tablas A y B.

unión exterior derecha

Una unión externa derecha (o simplemente unión derecha ) se asemeja mucho a una unión externa izquierda, con la diferencia de que el tratamiento de las tablas se invierte. Cada fila de la tabla "derecha" (B) aparecerá en la tabla resultante al menos una vez. Si no existe ninguna fila coincidente en la tabla "izquierda" (A), aparecerá NULL en las columnas de A para aquellas filas que no tengan coincidencia en B.

Una unión externa derecha devuelve todos los valores de la tabla derecha y los valores coincidentes de la tabla izquierda (NULL si no hay predicado de unión coincidente). Por ejemplo, esto nos permite encontrar a cada empleado y su departamento, pero también mostrar los departamentos que no tienen empleados.

A continuación se muestra un ejemplo de una unión externa derecha (la OUTERpalabra clave es opcional), con la fila de resultados adicional en cursiva:

SELECT * FROM employee RIGHT OUTER JOIN department ON employee . DepartmentID = department . DepartmentID ;

Las uniones externas derecha e izquierda son funcionalmente equivalentes. Ninguna proporciona ninguna funcionalidad que la otra no tenga, por lo que pueden sustituirse mutuamente siempre que se cambie el orden de las tablas.

Un diagrama de Venn que muestra el círculo derecho, el círculo izquierdo y la porción superpuesta rellena.
Diagrama de Venn que representa la sentencia SQL de unión completa entre las tablas A y B.

Unión exterior completa

Conceptualmente, una unión externa completa combina el efecto de aplicar uniones externas izquierdas y derechas. Cuando las filas de las tablas unidas externamente completas no coinciden, el conjunto de resultados tendrá valores NULL para cada columna de la tabla que no tenga una fila coincidente. Para las filas que sí coinciden, se generará una sola fila en el conjunto de resultados (que contendrá columnas con datos de ambas tablas).

Por ejemplo, esto nos permite ver a cada empleado que pertenece a un departamento y a cada departamento que tiene un empleado, pero también ver a cada empleado que no forma parte de un departamento y a cada departamento que no tiene un empleado.

Ejemplo de una unión externa completa (la OUTERpalabra clave es opcional):

SELECT * FROM employee FULL OUTER JOIN department ON employee . DepartmentID = department . DepartmentID ;

Algunos sistemas de bases de datos no admiten directamente la funcionalidad completa de unión externa, pero pueden emularla mediante el uso de una unión interna y selecciones UNION ALL de las "filas de tabla únicas" de las tablas izquierda y derecha respectivamente. El mismo ejemplo puede aparecer de la siguiente manera:

SELECCIONAR empleado.Apellido , empleado.IDDepartamento , departamento.NombreDepartamento , departamento.IDDepartamento FROM empleado UNIÓN INTERNA departamento ON empleado.IDDepartamento = departamento.IDDepartamentoUNIÓN TODOSSELECCIONAR empleado.Apellido , empleado.IDdepartamento , CAST ( NULL AS VARCHAR ( 20 ) ) , CAST ( NULL AS INTEGRALE ) DE empleado DONDE NO EXISTE ( SELECCIONAR * DE departamento DONDE empleado.IDdepartamento = departamento.IDdepartamento )UNIÓN TODOSSELECT cast ( NULL as varchar ( 20 )), cast ( NULL as integer ), department . DepartmentName , department . DepartmentID FROM department WHERE NOT EXISTS ( SELECT * FROM employee WHERE employee . DepartmentID = department . DepartmentID )

Otro enfoque podría ser UNIR TODOS los elementos de la unión externa izquierda y la unión externa derecha MENOS la unión interna.

Autoinscripción

Una auto-unión es unir una tabla consigo misma. [ 10 ]

Ejemplo

Si hubiera dos tablas separadas para los empleados y una consulta que solicitara empleados de la primera tabla que tuvieran el mismo país que los empleados de la segunda tabla, se podría usar una operación de unión normal para encontrar la tabla de respuesta. Sin embargo, toda la información de los empleados está contenida en una única tabla grande. [ 11 ]

Considere una Employeetabla modificada como la siguiente:

Un ejemplo de consulta de solución podría ser el siguiente:

SELECT F . EmployeeID , F . LastName , S . EmployeeID , S . LastName , F . Country FROM Employee F INNER JOIN Employee S ON F . Country = S . Country WHERE F . EmployeeID < S . EmployeeID ORDER BY F . EmployeeID , S . EmployeeID ;

Lo cual da como resultado la generación de la siguiente tabla.

Para este ejemplo:

  • Fy Sson alias para la primera y la segunda copia de la tabla de empleados.
  • Esta condición F.Country = S.Countryexcluye las parejas formadas por empleados de diferentes países. La pregunta de ejemplo solo solicitaba parejas de empleados del mismo país.
  • La condición F.EmployeeID < S.EmployeeIDexcluye los emparejamientos donde el valor EmployeeIDdel primer empleado es mayor o igual que el EmployeeIDdel segundo. En otras palabras, esta condición excluye los emparejamientos duplicados y los autoemparejamientos. Sin ella, se generaría la siguiente tabla, menos útil (la tabla a continuación muestra solo la parte correspondiente a "Alemania"):

Basta con uno de los dos pares intermedios para satisfacer la pregunta original, y los pares superior e inferior no tienen ningún interés en este ejemplo.

Alternativas

El efecto de una unión externa también se puede obtener utilizando una UNION ALL entre una INNER JOIN y una SELECT de las filas en la tabla "principal" que no cumplen la condición de unión. Por ejemplo,

SELECT employee.LastName , employee.DepartmentID , department.DepartmentName FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID ;

también se puede escribir como

SELECCIONAR empleado.Apellido , empleado.IDDepartamento , departamento.NombreDepartamento FROM empleado UNIÓN INTERNA departamento ON empleado.IDDepartamento = departamento.IDDepartamentoUNIÓN TODOSSELECCIONAR empleado.Apellido , empleado.IDDepartamento , CAST ( NULL AS VARCHAR ( 20 ) ) DE empleado DONDE NO EXISTE ( SELECCIONAR * DE departamento DONDE empleado.IDDepartamento = departamento.IDDepartamento )

Implementación

Un plan de consulta para la consulta triangular R(A, B) ⋈ S(B, C) ⋈ T(A, C) que utiliza uniones binarias. Primero une S y T, y luego une el resultado con R.
Un plan de consulta para la consulta triangular R(A, B) ⋈ S(B, C) ⋈ T(A, C) que utiliza uniones binarias. Primero une R y S, y luego une el resultado con T.
Dos posibles planes de consulta para la consulta triangular R(A, B) ⋈ S(B, C) ⋈ T(A, C) ; el primero une S y T primero y une el resultado con R , el segundo une R y S primero y une el resultado con T.

Gran parte del trabajo en sistemas de bases de datos se ha centrado en la implementación eficiente de las uniones, ya que los sistemas relacionales suelen requerirlas, pero presentan dificultades para optimizar su ejecución. El problema surge porque las uniones internas operan tanto de forma conmutativa como asociativa . En la práctica, esto significa que el usuario simplemente proporciona la lista de tablas a unir y las condiciones de unión a utilizar, y el sistema de base de datos tiene la tarea de determinar la forma 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, ya que cada tabla tiene características diferentes en cuanto al número de registros, la longitud media de los registros (considerando los campos NULL) y los índices disponibles. Los filtros de la cláusula WHERE también pueden afectar significativamente el volumen y el coste de la consulta.

Un optimizador de consultas determina cómo ejecutar una consulta que contiene uniones. Un optimizador de consultas tiene dos libertades básicas:

  1. Orden de unión : Dado que las funciones se unen de forma conmutativa y asociativa, el orden en que el sistema une las tablas no altera el conjunto de resultados final de la consulta. Sin embargo, el orden de unión puede tener un impacto considerable en el costo de la operación, por lo que elegir el orden óptimo resulta fundamental.
  2. Método de unión : Dadas dos tablas y una condición de unión, existen varios algoritmos que pueden generar el conjunto de resultados de la unión. El algoritmo más eficiente depende del tamaño de las tablas de entrada, la cantidad 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 forma diferente. Se puede hacer referencia a las entradas de una unión como operandos de unión "externa" e "interna", o "izquierda" y "derecha", respectivamente. En el caso de bucles anidados, por ejemplo, el sistema de base de datos recorrerá toda la relación interna para cada fila de la relación externa.

Los planes de consulta que involucran uniones se pueden clasificar de la siguiente manera: [ 12 ]

izquierda profunda
utilizando una tabla base (en lugar de otra unión) como operando interno de cada unión en el plan
derecha profunda
utilizando una tabla base como operando externo de cada unión en el plan
tupido
ni de izquierda a derecha ni de derecha a izquierda; ambas entradas a una unión pueden ser resultado de uniones.

Estos nombres derivan de la apariencia del plan de consulta cuando se dibuja como un árbol , con la relación de unión externa a la izquierda y la relación interna a la derecha (como dicta la convención).

Unirse a los algoritmos

Ilustración de las propiedades de los algoritmos de unión. Al realizar una unión entre más de dos relaciones con más de dos atributos, los algoritmos de unión binaria, como la unión hash, operan sobre dos relaciones a la vez y las unen en todos los atributos de la condición de unión; los algoritmos óptimos en el peor de los casos, como la unión genérica, operan sobre un solo atributo a la vez, pero unen todas las relaciones en este atributo. [ 13 ]

Existen tres algoritmos fundamentales para realizar una operación de unión binaria: unión por bucle anidado , unión por ordenación y fusión , y unión por hash . Los algoritmos de unión óptimos 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 base de datos que facilitan el procesamiento de consultas de unión en almacenes de datos : actualmente (2012) están disponibles en implementaciones de Oracle [ 14 ] y Teradata [ 15 ] .

En la implementación de Teradata, las columnas, las funciones de agregación o los componentes de las columnas de fecha de una o más tablas se especifican mediante una sintaxis similar a la definición de una vista de base de datos : se pueden especificar hasta 64 columnas o expresiones de columna en un único índice de unión. Opcionalmente, también se puede especificar una columna que defina la clave primaria de los datos compuestos: en hardware paralelo, los valores de las columnas se utilizan para particionar el contenido del índice en varios discos. Cuando los usuarios actualizan interactivamente las tablas de origen, el contenido del índice de unión se actualiza automáticamente. Cualquier consulta cuya cláusula WHERE especifique una combinación de columnas o expresiones de columna que sean un subconjunto exacto de las definidas en un índice de unión (una consulta de cobertura) hará que se consulte el índice de unión, en lugar de las tablas originales y sus índices, durante la ejecución de la consulta.

La implementación de Oracle se limita al uso de índices de mapa 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 varias tablas relacionadas. El ejemplo que utiliza Oracle es el de un sistema de inventario, donde diferentes proveedores suministran diferentes piezas. El esquema tiene tres tablas vinculadas: dos "tablas maestras", Pieza y Proveedor, y una "tabla de detalle", Inventario. Esta última es una tabla de muchos a muchos que vincula Proveedor con Pieza y contiene la mayor cantidad de filas. Cada pieza tiene un Tipo de pieza, y cada proveedor tiene su sede en EE. UU. y tiene una columna Estado. No hay más de 60 estados y territorios en EE. UU., y no más de 300 Tipos de pieza. 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 Tipo_de_pieza y Estado_del_proveedor para el índice. Sin embargo, está definido en la tabla Inventario, aunque las columnas Part_Type y Supplier_State se "toman prestadas" de Supplier y Part respectivamente.

En cuanto a Teradata, un índice de unión de mapa de bits de Oracle solo se utiliza para responder a una consulta cuando la cláusula WHERE de la consulta especifica columnas limitadas a las que están incluidas en el índice de unión.

Unión recta

Algunos sistemas de bases de datos permiten al usuario forzar al sistema a leer las tablas en una operación de unión en un orden específico. Esto se utiliza cuando el optimizador de la unión elige leer las tablas en un orden ineficiente. Por ejemplo, en MySQL, el comando STRAIGHT_JOINlee las tablas exactamente en el orden que aparece en la consulta. [ 16 ]

Véase también

Referencias

Citas

  1. COMBINACIÓN CRUZADA SQL
  2. Robidoux, Greg (3 de mayo de 2007). "Evite las funciones de SQL Server en la cláusula WHERE para mejorar el rendimiento" . Consejos sobre MSSQL.
  3. Wolf, Patrick (30/11/2006). "Dentro de Oracle APEX: Precaución al usar funciones PL/SQL en una sentencia SQL" . Dentro de Oracle APEX. Archivado del original el 27/12/2018.
  4. Larsen, Gregory A. (2009-10-29). "Mejores prácticas de T-SQL: no utilice funciones de valor escalar en listas de columnas ni en cláusulas WHERE" . Database Journal.
  5. Simplificación de uniones con la palabra clave USING
  6. En Unicode , el símbolo de pajarita es ⋈ (U+22C8).
  7. Pregunta a Tom: "Soporte de Oracle para uniones ANSI". De vuelta a lo básico: uniones internas  » Blog de Eddie Awad Archivado el 19/11/2010 en Wayback Machine
  8. Silberschatz, Abraham ; Korth, Hank ; Sudarshan, S. (2002). «Sección 4.10.2: Tipos y condiciones de unión». Conceptos de sistemas de bases de datos (4.ª ed.). McGraw-Hill. pág. 166. ISBN   0072283637.
  9. [4133310858797322]
  10. Shah 2005 , pág. 165 
  11. Adaptado de Pratt 2005 , págs. 115–6 
  12. ^ Yu y Meng 1998 , pág. 213 
  13. Wang, Yisu Remy; Willsey, Max; Suciu, Dan (27-01-2023). "Free Join: Unifying Worst-Case Optimal and Traditional Joins". arXiv : 2301.10841 [ cs.DB ].
  14. Índices de unión de mapa de bits de Oracle. "Conceptos de bases de datos - 5 Índices y tablas organizadas por índices - Índices de unión de mapa de bits" . Consultado el 23 de junio de 2024 .
  15. Índices de unión de Teradata. "Sintaxis y ejemplos del lenguaje de definición de datos SQL - CREATE JOIN INDEX" . Consultado el 23 de junio de 2024 .
  16. "13.2.9.2 Sintaxis JOIN" . Manual de referencia de MySQL 5.7 . Oracle Corporation . Consultado el 3 de diciembre de 2015 .

Fuentes

  • Pratt, Phillip J (2005), Guía de SQL, Séptima edición , Thomson Course Technology, ISBN 978-0-619-21674-0
  • Shah, Nilesh (2005) [2002], Sistemas de bases de datos con Oracle: una guía simplificada de SQL y PL/SQL, segunda edición (  edición internacional), Pearson Education International, ISBN 0-13-191180-5
  • Yu, Clement T.; Meng, Weiyi (1998), Principios del procesamiento de consultas de bases de datos para aplicaciones avanzadas , Morgan Kaufmann, ISBN 978-1-55860-434-6, recuperado el 3 de marzo de 2009
  • Específico para productos:
    • Uniones de Sybase ASE 15
    • Uniones en MySQL 8.0
    • PostgreSQL 14 Uniones
    • Uniones en Microsoft SQL Server
    • Uniones en MaxDB 7.6
    • Uniones en Oracle 12c R1
    • Uniones SQL de Oracle