TOP

SQL-Lección 11. Combinación avanzada de tablas (OUTER JOIN)

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.


1. Uso de alias de tablas (Aliases)

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.

2. Autoconexión (SELF JOIN)

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.

3. Combinación natural

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.

4. Combinación externa (OUTER JOIN)

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.

5. Unión externa completa (FULL OUTER JOIN)

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.