Capítulo 8 CLASE 8

8.1 JOIN SQL

Uno de los tipos más simples de operaciones join para implementar son las operaciones separadas por comas. En este tipo de operación, sólo se necesita proporcionar una lista de tablas (separadas por comas) en la cláusula FROM de la instrucción SELECT. Se puede, por supuesto, cualificar la operación join en la cláusula WHERE (lo cual es necesario para obtener datos significativos desde las tablas), pero no es obligatorio hacerlo. Sin embargo, antes de analizar la cláusula WHERE, demos primero un vistazo a las operaciones join separadas por comas desde sus puntos más básicos. Supongamos que se quieren desplegar los datos de la tabla INVENTARIO_CD y de la tabla INTERPRETES. Se pueden visualizar los datos de las tablas INVENTARIO_CD e INTERPRETES consultando cada tabla por separado, o se pueden unir las tablas en una instrucción.

Para unir las dos tablas, se puede crear una instrucción SELECT tan simple como la siguiente:

SELECT * FROM INVENTARIO_CD, INTERPRETES;

La consulta produce lo que se conoce como una tabla de producto cartesiano (nombrada así debido al matemático y filósofo francés René Descartes), que es una lista de cada fila en una tabla, unida con cada una de las filas en la otra tabla.

8.2 Utilizar nombres de correlación

Como se estipuló anteriormente, se deben cualificar las referencias de columna agregando nombres de tabla a aquellas columnas que compartan un nombre. Sin embargo, como una política general, siempre es una buena idea cualificar las referencias de columna cuando se unan tablas, sea necesario o no. Esto vuelve mucho más fácil referenciar el código en algún momento posterior si la instrucción es totalmente autodocumentada. Sin embargo, cuando sus consultas se vuelvan mucho más complejas, se puede volver muy tedioso reingresar los nombres de las tablas cada vez que se hace referencia a una columna. Debido a esto, SQL soporta nombres de correlación, o alias, que pueden ser utilizados durante la duración de una instrucción. Un nombre de correlación es simplemente una versión más corta del nombre de tabla actual que se utiliza para simplificar el código y hacerlo más legible. Tomemos, por ejemplo, la última instrucción SELECT que se vio. Se puede moldear esta instrucción utilizando nombres de correlación para ambas tablas:

SELECT c.NOMBRE_CD, p.NOMBRE_INTER, c.EN_EXISTENCIA

FROM INVENTARIO_CD AS c, INTERPRETES AS p

WHERE c.ID_INTER = p.ID_INTER

AND c.EN_EXISTENCIA < 15;

La instrucción SELECT produce exactamente los mismos resultados que la instrucción anterior, excepto en la cláusula FROM.

8.3 Crear operaciones join con más de dos tablas

Hasta este punto, los ejemplos que se han visto han unido solamente dos tablas. Sin embargo, se puede utilizar una operación join separada por comas para desplegar datos de más de dos tablas.

8.3.1 Ejemplo JOIN SQL

Es posible, si se desea, unir las tres tablas en una sola instrucción SELECT, como se muestra en el siguiente ejemplo:

SELECT c.NOMBRE_CD, p.NOMBRE_INTER, t.NOMBRE_TIPO

FROM INVENTARIO_CD c, INTERPRETES p, TIPO_INTER t

WHERE c.ID_INTER = p.ID_INTER

AND p.ID_TIPO = t.ID_TIPO

AND NOMBRE_TIPO = ‘Popular’;

En esta instrucción, la cláusula FROM incluye todas las tres tablas. Adicionalmente, la cláusula WHERE proporciona dos condiciones equi-join: una que traza las columnas ID_INTER y otra que traza las columnas ID_TIPO.

8.4 CROSS JOIN

Además de la operación join separada por comas, SQL soporta otro tipo de operación llamada cross join. Esta operación es prácticamente idéntica a la operación join separada por comas. La única diferencia es que en lugar de separar los nombres de columna con una coma, se utilizan las palabras clave CROSS JOIN. Por ejemplo, tomemos una instrucción que se utilizó anteriormente y modifiquémosla reemplazándola con las palabras clave CROSS JOIN:

SELECT c.NOMBRE_CD, p.NOMBRE_INTER, c.EN_EXISTENCIA

FROM INVENTARIO_CD c CROSS JOIN INTERPRETES p

WHERE c.ID_INTER = p.ID_INTER

AND c.EN_EXISTENCIA < 15;

Esta instrucción arroja tres columnas desde dos tablas, y la cláusula WHERE contiene una condición equi-join. Decidir entre utilizar una o la otra puede simplemente ser una cuestión de determinar cuál instrucción es soportada por la implementación SQL, y, si ambas son soportadas, cuál de ellas proporciona un mejor rendimiento. Con toda probabilidad, se convertirá en un asunto de preferencia personal, con pocas ventajas entre una y otra.

8.5 PASO A PASO: JOIN

Abra la aplicación de cliente para su RDBMS y conéctese con la base de datos INVENTARIO.

  1. El primer tipo de operación a realizar será una operación join separada por comas en las tablas ARTISTAS y CDS_ARTISTA. La operación join utilizará la columna ID_ARTISTA para establecer la condición equi-join. Ingrese y ejecute la siguiente instrucción SQL:

SELECT *

FROM ARTISTAS a, CD_ARTISTAS c

WHERE a.ID_ARTISTA = c.ID_ARTISTA

Los resultados de la consulta deberán incluir 19 filas, y también las columnas ID_ARTISTA de ambas tablas al igual que las columnas NOMBRE_ARTISTA, LUGAR_DE_NACIMIENTO e ID_DISCO_COMPACTO.

  1. Ahora se modificará la instrucción anterior para que también pueda unir la tabla DISCOS_ COMPACTOS. De esa manera, se puede desplegar el nombre real de los CD. Adicionalmente, se especifican los nombres de las columnas que deberán ser arrojadas. Ingrese y ejecute la siguiente instrucción SQL:

SELECT d.TITULO_CD, a.NOMBRE_ARTISTA, a.LUGAR_DE_NACIMIENTO

FROM ARTISTAS a, CD_ARTISTAS c, DISCOS_COMPACTOS d

WHERE a.ID_ARTISTA = c.ID_ARTISTA

AND d.ID_DISCO_COMPACTO = c.ID_DISCO_COMPACTO;

Los resultados de la consulta deberán incluir una vez más 19 filas. Sin embargo, esta vez los resultados desplegarán solamente las columnas TITULO_CD, NOMBRE_ARTISTA y LUGAR_DE_NACIMIENTO.

Ahora convirtamos la anterior instrucción SELECT en una operación cross join. Ingrese y eje- cute la siguiente instrucción SQL:

SELECT d.TITULO_CD, a.NOMBRE_ARTISTA, a.LUGAR_DE_NACIMIENTO

FROM ARTISTAS a CROSS JOIN CD_ARTISTAS c CROSS JOIN DISCOS_COMPACTOS d

WHERE a.ID_ARTISTA = c.ID_ARTISTA

AND d.ID_DISCO_COMPACTO = c.ID_DISCO_COMPACTO;

Se recibirán los mismos resultados de la consulta que se arrojaron en la anterior instrucción SELECT.

  1. El siguiente tipo de instrucción que deberá ejercitar es una condición join. La primer condición será del tipo inner join. En esta instrucción se unirán tres tablas: DISCOS_COMPACTOS, TIPOS_DISCO_COMPACTO y TIPOS_MUSICA. Ingrese y ejecute la siguiente instrucción SQL:

SELECT d.TITULO_CD, t.NOMBRE_TIPO

FROM DISCOS_COMPACTOS d JOIN TIPOS_DISCO_COMPACTO dt

ON d.ID_DISCO_COMPACTO = dt.ID_DISCO_COMPACTO

JOIN TIPO_MUSICA t

ON dt.ID_TIPO = t.ID_TIPO;

Solamente las columnas TITULO_CD y NOMBRE_TIPO deberán ser desplegadas.

  1. Ahora modifiquemos la anterior instrucción SELECT para crear una operación full outer join en ambas condiciones join. Ingrese y ejecute la siguiente instrucción SQL:

SELECT d.TITULO_CD, t.NOMBRE_TIPO

FROM DISCOS_COMPACTOS d JOIN TIPOS_DISCO_COMPACTO dt

ON d.ID_DISCO_COMPACTO = dt.ID_DISCO_COMPACTO

JOIN TIPO_MUSICA t

ON dt.ID_TIPO = t.ID_TIPO;

  1. Cierre la aplicación cliente.

En este ejercicio se crearon operaciones join separadas por comas, operaciones cross y operaciones de condición. Las operaciones join de condición incluían inner y outer joins. Como se puede ver, las operaciones join proporcionan gran flexibilidad cuando se consultan datos desde las tablas en la base de datos. Sin embargo, no son la única solución cuando se necesitan datos de más de una tabla. Una subconsulta a menudo proporcionará la misma funcionalidad que una operación join.