Unión (SQL)

Una combinación interna requiere que cada fila de las dos tablas unidas tenga valores de columna coincidentes, y es una operación de combinación de uso común en las aplicaciones, pero no se debe suponer que sea la mejor opción en todas las situaciones. La combinación interna crea una nueva tabla de resultados combinando valores de columna de dos tablas (A y B) según el predicado de 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 coincidente de filas 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 combinació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 combinación. Las implementaciones reales de SQL normalmente utilizan otros enfoques, como combinaciones hash o combinaciones de clasificación y combinación, ya que calcular el producto cartesiano es más lento y, a menudo, requeriría una cantidad prohibitivamente grande de memoria para almacenar.

SQL especifica dos combinaciones sintácticas diferentes formas de expresar combinaciones: la «notación de combinación explícita» y la «notación de combinación implícita». La «notación de combinación implícita» ya no se considera una práctica recomendada, aunque los sistemas de bases de datos aún la admiten.

La «notación de combinación explícita» utiliza la palabra clave JOIN, opcionalmente precedido por la palabra clave INNER, para especificar la tabla a unir, y la palabra clave ON para especificar los predicados para la combinación, como en el siguiente ejemplo:

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;

Employee.LastName Employee.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 t Las tablas para unirse, en la cláusula FROM de la instrucción SELECT, usando comas para separarlas. Por lo tanto, especifica una combinación cruzada, y la cláusula WHERE puede aplicar predicados de filtro adicionales (que funcionan de manera comparable a los predicados de combinación en la notación explícita).

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

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;

Las consultas dadas en los ejemplos anterior se unirá a las tablas Empleado y Departamento utilizando la columna DepartmentID de ambas tablas. Cuando el DepartmentID de estas tablas coincide (es decir, se satisface el predicado de unión), la consulta combinará las columnas LastName, DepartmentID y DepartmentName de las dos tablas en una fila de resultados. Cuando DepartmentID no coincide, no se genera una fila de resultados.

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

Employee.LastName Employee.DepartmentID Department.DepartmentName
Robinson 34 Oficinista
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 un 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 puede evitarse reemplazando la combinación interna con una combinación externa.

Unión interna y valores NULLEditar

Los programadores deben tomar especial cuidado al unir tablas en columnas que pueden contener valores NULL, ya que NULL nunca coincidirá con ningún otro valor (ni siquiera NULL), a menos que la condición de combinación use explícitamente un predicado de combinación que primero verifique que las columnas de combinación sean NOT NULL antes de aplicar las condiciones de predicado restantes. La combinación interna solo se puede usar de forma segura en una base de datos que refuerza la integridad referencial o donde se garantiza que las columnas de combinación no serán NULL. Muchas bases de datos relacionales de procesamiento de transacciones se basan en los estándares de actualización de datos de Atomicidad, Consistencia, Aislamiento, 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 también suelen tener columnas de unión deseables que pueden ser NULL.Muchos almacenes de datos y bases de datos relacionales de informes utilizan actualizaciones por lotes de extracción, transformación y carga (ETL) de gran volumen que dificultan o imposibilitan la aplicación de la integridad referencial, lo que genera columnas de unión potencialmente NULL que un autor de consultas SQL no puede modificar y que provocan la omisión de 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 las características de los datos. Por lo general, una combinación externa izquierda puede sustituirse 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 tabla. unión interna, a menos que el resultado deseado sea eliminar las filas con el valor NULL. Si las columnas de combinación NULL deben eliminarse deliberadamente del conjunto de resultados, una combinación interna puede ser más rápida que una combinación externa porque la combinación de la tabla y el filtrado se realizan en un solo paso. Por el contrario, una unión interna puede resultar en un rendimiento desastrosamente lento o incluso en un bloqueo del servidor cuando se usa en una consulta de gran volumen en combinación con funciones de base de datos en una cláusula SQL Where. 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 un conjunto de resultados se produce al unir varias tablas, incluidas las tablas maestras que se utilizan para buscar descripciones de texto completo de códigos de identificadores numéricos (una tabla de búsqueda), un valor NULO en cualquiera de las claves externas puede dar como resultado que toda la fila se elimine 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 lo harán. introducirá 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 las uniones internas como equi-uniones, como uniones naturales o como uniones cruzadas.

Equi-joinEdit

Un equi-join es un tipo específico de unión basada en comparadores, que usa solo comparaciones de igualdad en el predicado de combinación. El uso de otros operadores de comparación (como <) descalifica una combinación como una combinación equitativa. La consulta que se muestra arriba ya ha proporcionado un ejemplo de una combinación equitativa:

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

Podemos escribir equi-join como se muestra a continuación,

SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;

Si co lumns en un equi-join tienen el mismo nombre, SQL-92 proporciona una notación abreviada opcional para expresar equi-joins, por medio de la USING construcción:

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

La construcción USING es más que un simple azúcar sintáctico, sin embargo, ya que el conjunto de resultados difiere del resultado conjunto 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 en la combinación. En el caso anterior, habrá una única DepartmentID columna y ninguna employee.DepartmentID o department.DepartmentID .

La cláusula USING no es compatible con MS SQL Server y Sybase.

Natural joinEdit

El natural join es un caso especial de equi-join. 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.Para ver un ejemplo, considere las tablas Empleado y Departamento y su combinación natural:

Empleado
Nombre EmpId DeptName
Harry 3415 Finanzas
Sally 2241 Ventas
George 3401 Finanzas
Harriet 2202 Ventas
Dept
DeptName Gerente
Finanzas George
Ventas Harriet
Producción Charles
Empleado ⋈ {\ displaystyle \ bowtie} Dept
Nombre EmpId DeptName Gerente
Harry 3415 Finanzas George
Sally 2241 Ventas Harriet
George 3401 Finanzas George
Harriet 2202 Ventas Harriet

Esto también se puede usar para definir la composición de relaciones. Por ejemplo, la composición de Empleado y Departamento es su combinación como se muestra arriba, proyectada en todos menos el atributo común DeptName. En 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 los dos predicados que están conectados por AND, entonces esa variable representa lo mismo y ambas apariencias siempre deben ser sustituidas por el mismo valor. En particular, la combinación natural permite la combinación de relaciones asociadas por una clave externa. Por ejemplo, en el ejemplo anterior, una clave externa probablemente se mantenga de Employee.DeptName a Dept.DeptName y luego la unión natural de Employee y Dept combina 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 Dept.manager a Employee.Name, entonces estas columnas deben cambiarse de nombre antes de que se tome la combinación natural. Esta unión a veces 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 ∧ F un (t ∪ s)} {\ 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. Por lo general, se requiere que R y S deben tener 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.

El La unión natural se puede simular con las primitivas de Codd de la siguiente manera. Sean c1,…, cm los nombres de atributo comunes a R y S, r1,…, rn los nombres de atributo exclusivos de R y sean s1,…, sk el atributos exclusivos de S. Además, suponga que los nombres de atributo x1,…, xm no están ni en R ni en S. En un primer paso, los nombres de atributos comunes en S ahora se pueden renombrar:

T = ρ x 1 / do 1,…, xm / cm (S) = ρ x 1 / c 1 (ρ x 2 / c 2 (… ρ xm / cm (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 = π r 1,…, rn, do 1,…, cm, s 1,…, sk (P) {\ 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 equi- join donde el predicado join surge implícitamente al comparar todas las columnas en ambas tablas que tienen los mismos nombres de columna en las tablas unidas. La tabla combinada resultante contiene solo una columna para cada par de columnas con el mismo nombre. En el caso de que no se encuentren columnas con los mismos nombres, el resultado es una combinación cruzada.

La mayoría de los expertos están de acuerdo en que las UNIONES NATURALES son peligrosas y, por lo tanto, desaconsejan su uso. El peligro proviene de agregar inadvertidamente una nueva columna, con el mismo nombre que otra columna en la otra tabla. Una combinación natural existente podría entonces usar «naturalmente» la nueva columna para comparaciones, haciendo comparaciones / coincidencias usando diferentes criterios (de diferentes columnas) que antes. Por lo tanto, una consulta existente podría producir resultados diferentes, aunque los datos de las tablas no se hayan modificado, solo se hayan aumentado.El uso de nombres de columna para determinar automáticamente los enlaces 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 en las convenciones de nombres. 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 el contexto. Es una práctica común modificar los nombres de columna de datos similares en diferentes tablas y esta falta de coherencia rígida relega las uniones naturales a un concepto teórico para la discusión.

La consulta de ejemplo anterior para las uniones internas se puede expresar como una únete de la siguiente manera:

SELECT *FROM employee NATURAL JOIN department;

Al igual que con la cláusula explícita USING, solo aparece una columna DepartmentID en la tabla unida, sin calificador:

DepartmentID Employee.LastName Department.DepartmentName
34 Smith Clerical
33 Jones Ingeniería
34 Robinson Clerical
33 Heisenberg Ingeniería
31 Rafferty Ventas

PostgreSQL, MySQL y Oracle su pport 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 son parte del paquete opcional F401, «Tabla unida extendida».

En muchos entornos de bases de datos, los nombres de las columnas son controlados por un proveedor externo, no por el desarrollador de consultas. Una unión natural asume estabilidad y consistencia en los nombres de las columnas que pueden cambiar durante las actualizaciones de versión exigidas por el proveedor.

Write a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *