Fundamentos de SQL: Consultas SELECT multi-tabla - JOIN

Fundamentos de SQL: Consultas SELECT multi-tabla - JOIN



SQL-Consultas-Multi-Tabla
En un anterior post sobre fundamentos de SQL vimos lo básico de crear consultas con la instrucción SELECT. A continuación vamos a complicar un poco la cosa aprendiendo a realizar consultas en varias tablas de la base de datos al mismo tiempo.
Es habitual que queramos acceder a datos que se encuentran en más de una tabla y mostrar información mezclada de todas ellas como resultado de una consulta. Para ello tendremos que hacer combinaciones de columnas de tablas diferentes.
En SQL es posible hacer esto especificando más de una tabla en la cláusula FROM de la instrucción SELECT.
Tenemos varias formas de obtener esta información.

Una de ellas consiste en crear combinaciones que permiten mostrar columnas de diferentes tablas como si fuese una sola tabla, haciendo coincidir los valores de las columnas relacionadas.
Este último punto es muy importante, ya que si seleccionamos varias tablas y no hacemos coincidir los valores de las columnas relacionadas, obtendremos una gran duplicidad de filas, realizándose el producto cartesiano entre las filas de las diferentes tablas seleccionadas.
Vamos a ver este importante detalle con un ejemplo simple. Consideremos estas tres consultas sobre la base de datos Northwind:
SELECT COUNT(*) FROM Customers
SELECT COUNT(*) FROM Orders
SELECT COUNT(*) FROM Customers, Orders
La primera instrucción devuelve 91 filas (los 91 clientes), la segunda 830 filas (los pedidos), y la tercera 75.530 (que son 830 x 91, es decir, la combinación de todas las filas de clientes y de pedidos).
La otra manera de mostrar información de varias tablas -mucho más habitual y lógica- es uniendo filas de ambas, para ello es necesario que las columnas que se van a unir entre las dos tablas sean las mismas y contengan los mismos tipos de datos, es decir, mediante una clave externa.

Operaciones de unión - JOIN

La operación JOIN o combinación permite mostrar columnas de varias tablas como si se tratase de una sola tabla, combinando entre sí los registros relacionados usando para ello claves externas.
Las tablas relacionadas se especifican en la cláusula FROM, y además hay que hacer coincidir los valores que relacionan las columnas de las tablas.
Veamos un ejemplo, que selecciona el número de venta, el código y nombre del cliente y la fecha de venta en la base de datos Northwind:
SELECT OrderID, C.CustomerID, CompanyName, OrderDate
FROM Customers C, Orders O
WHERE C.CustomerID = O.CustomerID
Para evitar que se produzca como resultado el producto cartesiano entre las dos tablas, expresamos el vínculo que se establece entre las dos tablas en la cláusula WHERE. En este caso relacionamos ambas tablas mediante el identificador del cliente, clave existente en ambas. Fíjate en como le hemos otorgado un alias a cada tabla (C y O respectivamente) para no tener que escribir su nombre completo cada vez que necesitamos usarlas.
Hay que tener en cuenta que si el nombre de una columna existe en más de una de las tablas indicadas en la cláusula FROM, hay que poner, obligatoriamente, el nombre o alias de la tabla de la que queremos obtener dicho valor. En caso contrario nos dará un error de ejecución, indicando que hay un nombre ambiguo.
Hay otra forma adicional, que es más explícita y clara a la hora de realizar este tipo de combinaciones -y que se incorpora a partir de ANSI SQL-92- que permite utilizar una nueva cláusula llamada JOIN en la cláusula FROM, cuya sintaxis es el siguiente:En el caso del ejemplo anterior quedaría de la siguiente forma:
SELECT [ ALL / DISTINC ] [ * ] / [ListaColumnas_Expresiones]
FROM NombreTabla1 JOIN NombreTabla2 ON Condiciones_Vinculos_Tablas
De esta manera relacionamos de manera explícita ambas tablas sin necesidad de involucrar la clave externa en las condiciones del SELECT (o sea, en el WHERE). Es una manera más clara y limpia de llevar a cabo la relación.
Esto se puede ir aplicando a cuantas tablas necesitemos combinar en nuestras consultas. Veamos un ejemplo en ambos formatos que involucra más tablas, en este caso las tablas de empleados, clientes y ventas:
SELECT OrderID, C.CustomerID, CompanyName, OrderDate
FROM Customers C, Orders O, Employees E
WHERE C.CustomerID = O.CustomerID AND O.EmployeeID = E.EmployeeID
El segundo formato permite distinguir las condiciones que utilizamos para combinar las tablas y evitar el producto cartesiano, de las condiciones de filtro que tengamos que establecer.
Veamos un ejemplo como el anterior, pero ahora además necesitamos que el cliente sea de España o el vendedor sea el número 5.
En el primer formato tendríamos algo como esto:
SELECT OrderID, C.CustomerID, CompanyName, OrderDate
FROM Customers C, Orders O, Employees E
WHERE (C.CustomerID = O.CustomerID AND O.EmployeeID = E.EmployeeID)
AND (C.Country = 'Spain' OR E.EmployeeID = 5)
Es decir, estamos mezclando en el WHERE las uniones de tablas, y las condiciones concretas de filtro de la consulta, quedando todo mucho más liado.
Sin embargo usando el segundo formato con JOIN, la consulta es mucho más clara:
SELECT OrderID, C.CustomerID, CompanyName, OrderDate
FROM Customers C JOIN Orders O ON C.CustomerID = O.CustomerID JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE C.Country = 'Spain' OR E.EmployeeID = 5
Aquí se aprecia claramente que la utilización de JOIN simplifica la lectura y comprensión de la instrucción SQL, ya que no necesita el uso de paréntesis y tiene una condición WHERE más sencilla.
También podemos utilizar una misma tabla con dos alias diferentes para distinguirlas. Veamos un ejemplo, supongamos que tenemos una columna sueldo en la tabla de empleados, y queremos saber los empleados que tienen un sueldo superior al del empleado 5:
SELECT E1.EmployeeID
FROM Employees E1 JOIN Employees E2 ON E1.Sueldo > E2.Sueldo
WHERE E2.EmployeeID = 5
Con esto hemos aprendido lo básico de trabajar con varias tablas y generar combinaciones de datos entre éstas.
En un próximo artículo aprenderemos a ver los otros dos tipos de combinaciones que existen: las combinaciones internas y las externas, así como las combinaciones de conjuntos de resultados (uniones, intersecciones, etc...).

Comentarios

Entradas populares de este blog

Ejercicios para aprender AutoCAD 3D

Piezas 3D - interesantes

Cómo instalar una fuente de alimentación