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
read more