En la sección anterior, consideramos las formas más simples de combinar tablas: usando oraciones WHERE y INNER JOIN. Estas combinaciones se denominan combinaciones internas o combinaciones de equivalencia. Sin embargo, SQL tiene en su arsenal muchas más opciones para unir tablas, es decir, también hay otros tipos de uniones: uniones externas, uniones naturales y autouniones. Pero primero, consideremos cómo podemos asignar alias a las tablas, ya que luego nos veremos obligados a usar nombres completos de campos (Table.Field), que sin abreviaturas serán muy difíciles de operar debido a su gran longitud.
En la sección anterior, aprendimos cómo se pueden usar alias para hacer referencia a campos de tabla específicos o campos calculados. SQL también nos permite usar alias en lugar de nombres de tablas. Esto nos brinda ventajas como una sintaxis SQL más corta y nos permite usar la misma tabla varias veces en la declaración SELECT.
Run SQLSELECT Seller_name, SUM(Amount) AS Sum1
FROM Sellers AS S, Sumproduct AS SP
WHERE S.City = SP.City
GROUP BY Seller_name
Mostramos la cantidad total de productos vendidos para cada vendedor. En nuestra consulta SQL, utilizamos los siguientes alias: para el campo calculado SUM(Amount) el alias Sum1, para la tabla Sellers el alias S y para Sumproduct el alias SP. Tenga en cuenta que los alias de tabla también se pueden utilizar en otras oraciones, como ORDER BY, GROUP BY y otras.
Consideremos un ejemplo. Digamos que necesitamos saber la dirección de los vendedores que comercian en el mismo país que John Smith. Para ello crearemos la siguiente solicitud:
Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country
FROM Sellers
WHERE Seller_name = 'John Smith')
Además, podemos solucionar este problema mediante la autoconexión escribiendo el siguiente código:
Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'
Se utilizaron seudónimos para resolver este problema. La primera vez a la tabla Sellers se le asignó el alias S1, la segunda vez, el alias S2. Estos alias se pueden utilizar luego como nombres de tablas. En el operador WHERE, agregamos el prefijo S1 al nombre de cada campo, para que el DBMS comprenda los campos de qué tabla se debe generar (ya que creamos dos tablas virtuales a partir de una tabla). La cláusula WHERE primero une las tablas y luego filtra los datos de la segunda tabla por el campo Seller_name para devolver solo los valores necesarios.
Las autouniones se utilizan a menudo para reemplazar subconsultas que seleccionan datos de la misma tabla que el operador externo SELECT. Aunque el resultado final es el mismo, muchos procesos de DBMS se unen mucho más rápido que las subconsultas. Vale la pena experimentar para determinar qué consulta funciona más rápido.
Una combinación natural es una combinación en la que se seleccionan sólo aquellas columnas que no se repiten. Esto generalmente se hace escribiendo (SELECT *) para una tabla y especificando una lista de campos para el resto de las tablas. Ejemplo:
Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S
WHERE SP.City = S.City
En este ejemplo, el comodín (*) se utiliza sólo para la primera tabla. Todas las demás columnas se especifican explícitamente, por lo que no se seleccionan columnas duplicadas.
Por lo general, al fusionar, las filas de una tabla se conectan con las filas correspondientes de otra tabla; sin embargo, en algunos casos, puede ser necesario incluir en el resultado filas que no tienen filas relacionadas en otra tabla (es decir, todas se seleccionan filas de una tabla y solo se agregan líneas relacionadas de otra). Una conexión de este tipo se llama externa. Para ello se utilizan las palabras clave OUTER JOIN... ON... con el prefijo LEFT o RIGHT.
Consideremos un ejemplo, habiendo agregado previamente un nuevo vendedor, Semuel Piter, que aún no tiene ventas, a la tabla Sellers:
Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2
LEFT OUTER JOIN Sumproduct
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name
Con esta solicitud, extrajimos la lista de todos los vendedores en la base de datos y calculamos la cantidad total de bienes vendidos para ellos durante todos los meses. Vemos que no hay ventas para el nuevo vendedor Semuel Piter. Si usáramos una combinación interna, no veríamos al nuevo vendedor porque no tiene registros en la tabla Sumproduct. También podemos cambiar la dirección de la combinación no solo escribiendo LEFT o RIGHT, pero también simplemente cambiando el orden de las tablas (es decir, los dos registros siguientes darán el mismo resultado: Sellers LEFT OUTER JOIN Sumproduct y Sumproduct RIGHT OUTER JOIN Seller s).
Además, algunos DBMS permiten uniones externas en un registro simplificado usando los signos *= y =*, que corresponden a LEFT OUTER JOIN y RIGHT OUTER JOIN, respectivamente. Así, la consulta anterior podría reescribirse de la siguiente manera:
SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City
Lamentablemente, MS Access no admite un registro abreviado para una unión externa.
También existe otro tipo de combinación externa: una combinación externa completa, que muestra todas las filas de ambas tablas y combina solo aquellas que pueden estar relacionadas. La sintaxis de una unión externa completa es la siguiente:
SELECT Seller_name, Product
FROM Sellers
FULL OUTER JOIN Sumproduct
ON Sellers.City = Sumproduct.City
Nuevamente, la unión externa completa no es compatible con los siguientes DBMS: MS Access, MySQL, SQL Server y Sybase. Cómo solucionar esta injusticia, lo consideraremos en la siguiente sección.