Combinación interna (inner join) Sobre las tablas Libros y Editoriales Recuperamos los datos de libros: select *from libros; Vemos que en el campo editorial aparece el código, pero no sabemos el nombre de la editorial. Realizamos un join para obtener datos de ambas tablas (titulo, autor y nombre de la editorial): select titulo, autor, nombre from libros join editoriales on codigoeditorial=editoriales.codigo; Los libros cuyo código de editorial no se encuentra en EDITORIALES, no aparecerán en el resultado de la consulta. El libro " Oracle 11g. Administracion" tiene código de editorial 5, y ese código no está presente en la tabla EDITORIALES, y el libro " Oracle 11g. SQL*Plus y PL/SQL" tiene valor nulo en "codigoeditorial", por lo tanto, ninguno de los dos se muestran en el join. Mostramos el código del libro, título, autor y nombre de la editorial realizando un join y empleando alias: select l.codigo,titulo,autor,nombre from libros l join editoriales e on codigoeditorial=e.codigo; Al listar el campo CODIGO, hay que especificar a qué tabla pertenece; si no lo hacemos, Oracle no sabrá si nos referimos al de la tabla LIBROS o EDITORIALES. Los demás campos no tienen referencia a la tabla porque tienen nombres que no se repiten. Realizamos la misma consulta anterior agregando WHERE para obtener solamente los libros de la editorial "RAMA": select l.codigo,titulo,autor,nombre from libros l join editoriales e on codigoeditorial=e.codigo where e.nombre=' RA-MA'; Obtenemos título, autor y nombre de la editorial, esta vez ordenados por título: select titulo,autor,nombre from libros l join editoriales e on codigoeditorial=e.codigo order by titulo Ejercicios; Sobre las tablas CLIENTES y PROVINCIAS 1 Obtener datos de ambas tablas, que estén relacionados entre sí, usando alias 2 Obtener la misma información anterior pero ordenada por nombre de provincia (join y order by) 3 Recupera todos los datos de los clientes de la provincia "La Mata" (join con where) Sobre las tablas INSCRITOS y NOASISTENCIAS 4 Muestra el nombre, deporte y las fechas de NOASISTENCIAS, ordenado por nombre y deporte (la condición es compuesta porque para identificar los registros de la tabla NOASISTENCIAS necesitamos ambos campos. 5 Extrae nombre, deporte y las fechas de NOASISTENCIAS de un determinado inscrito en un determinado deporte 6 Obten el nombre, deporte y las fechas de NOASISTENCIAS de todos los inscriptos que pagaron la matrícula
Combinación externa izquierda (left join) Problema: Sobre las tablas LIBROS y EDITORIALES Les agregaremos dos restricciones nuevas; alter table editoriales add constraints UQ_editoriales_codigo unique (codigo); alter table libros add constraints UQ_libros_codigo unique (codigo); Igualmente, insertaremos algunos valores más; Para la tabla EDITORIALES; insert into editoriales values(null,'Marcombo'); insert into editoriales values(null,'Eni'); Para la tabla LIBROS insert into libros values(700,'Mastering SQL Queries for SAP Business','Varios',null); insert into libros values(800,'Oracle 10g ,'Abramson',null); ’
Realizamos una left join para obtener los títulos de los libros, incluyendo el nombre de la editorial: select titulo,nombre from editoriales e left join libros l on codigoeditorial = e.codigo; Las editoriales cuyo código de editorial no está presente en LIBROS o tienen valor nulo, aparecen en el resultado, pero con el valor null en el campo título (caso de "ENI" y "Marcombo"). Realizamos la misma consulta anterior pero cambiamos el orden de las tablas: select titulo,nombre from libros l left join editoriales e on codigoeditorial = e.codigo; El resultado mostrará el título del libro y el nombre de la editorial; los títulos cuyo código de editorial no está presente en EDITORIALES o tienen valor nulo, aparecen en el resultado, pero con el valor null en el campo "nombre" Restringimos el resultado de una consulta considerando solamente los registros que encuentran coincidencia en la tabla de la derecha, es decir, cuyo valor de código está presente en LIBROS: select titulo,nombre from editoriales e left join libros l on e.codigo=codigoeditorial where codigoeditorial is not null; Mostramos las editoriales que no están presentes en LIBROS, es decir, que no encuentran coincidencia en la tabla de la derecha: select nombre from editoriales e left join libros l on e.codigo=codigoeditorial where codigoeditorial is null; Aparecen 3 editoriales.
Sobre las tablas CLIENTES y PROVINCIAS Añadimos restricciones; alter table clientes add constraints UQ_clientes_codigo unique (codigo); alter table provincias add constraints UQ_provincias_codigo unique (codigo); Insertamos algunos valores nuevos; Para la tabla PROVINCIAS insert into provincias values(null,'Almeria'); Para la tabla CLIENTES insert into clientes values (11,'Rico Hermoso','Calle de la Suerte, 1','El Real',null); insert into clientes values (12,'Maximo Pi','Calle Matemáticas, sin numero','Alcontar',0); 7 Muestra todos los datos de los clientes, incluido el nombre de la provincia 8 Realiza la misma consulta anterior pero cambiando el orden de las tablas. 9 Muestra solamente los clientes de las provincias que existen en PROVINCIAS 10 Muestra todos los clientes cuyo código de provincia no existe en PROVINCIAS ordenados por nombre del cliente 11 Extrae todos los datos de los clientes de "Cordoba"
Combinación externa derecha (right join) Sobre las tablas LIBROS y EDITORIALES: Agregamos Primary Keys a ambas tablas: alter table libros add constraint PK_libros primary key(codigo); alter table editoriales add constraint PK_editoriales primary key(codigo); Extraemos el título y nombre de la editorial de los libros empleando un right join: select titulo,nombre as editorial from libros l right join editoriales e on codigoeditorial = e.codigo; Las editoriales de las cuales no hay libros, es decir, cuyo código de editorial no está presente en LIBROS aparece en el resultado, pero con el valor null en el campo titulo. Realizamos la misma consulta anterior agregando un where que devuelva el resultado considerando solamente los registros que encuentran coincidencia en la tabla izquierda: select titulo,nombre as editorial from libros l right join editoriales e on e.codigo=codigoeditorial where codigoeditorial is not null; Mostramos las editoriales que no están presentes en LIBROS (que no encuentran coincidencia en EDITORIALES): select nombre from libros l right join editoriales e on e.codigo=codigoeditorial where codigoeditorial is null; Sobre las tablas CLIENTES y PROVINCIAS 12 Muestra todos los datos de los clientes, incluido el nombre de la provincia empleando un right join. 13 Extrae la misma salida que la consulta anterior pero empleando un left join. 14 Empleando un right join, muestra solamente los clientes de las provincias que existen en PROVINCIAS 15 Muestra todos los clientes cuyo código de provincia no existe en provincias, ordenados por ciudad
Combinación externa (outer join) Sobre las tablas LIBROS y EDITORIALES: Agregamos dos claves únicas sobre el campo codigo de ambas tablas: alter table libros add constraint UQ_libros_codigo unique (codigo); alter table editoriales add constraint UQ_editoriales_codigo unique (codigo); Realizamos una combinación externa completa para obtener todos los registros de ambas tablas, incluyendo los libros cuyo código de editorial no existe en la tabla EDITORIALES y las editoriales de las cuales no hay correspondencia en LIBROS: select titulo,nombre as editorial from editoriales e full join libros l on codigoeditorial = e.codigo; Sobre las tablas DEPORTES e INSCRIPCIONES 16 Muestra toda la información de la tabla INSCRIPCIONES, y consulta la tabla DEPORTES para obtener el nombre de cada deporte 17 Empleando un left join con DEPORTES obtenga todos los datos de los inscritos 18 Obten el mismo resultado empleando un rigth join 19 Muestra los deportes para los cuales no hay inscritos, empleando un left join 20 Muestra los documentos de los inscritos a deportes que no existen en la tabla DEPORTES 21 Emplea un full join para obtener todos los datos de ambas tablas, incluyendo las inscripciones a deportes inexistentes en DEPORTES y los deportes que no tienen inscritos
Productos cartesianos (cross join) Sobre las tablas COMIDAS y POSTRES El restaurante quiere combinar los registros de ambas tablas para mostrar los distintos menús que ofrece. Lo hacemos usando un cross join: select c.nombre as "plato principal", p.nombre as "postre" from comidas c cross join postres p; La salida muestra cada plato combinado con cada uno de los postres. Se obtienen 8 registros. En la siguiente combinación cruzada, agregamos una columna que calcula el precio total de cada menú: select c.nombre as "plato principal", p.nombre as "postre", c.precio+p.precio as "total" from comidas c cross join postres p; La salida muestra cada plato combinado con cada uno de los postres y el precio total de cada menú. Se obtienen 8 registros. Sobre las tablas ACTORES y ACTRICES 22 Se necesita saber la combinación de todas las actrices con los actores, usando cross join 23 Realiza la misma combinación pero considerando solamente las personas mayores de 40 años 24 Forma parejas, teniendo en cuenta que no tengan una diferencia superior a 10 años Sobre las tablas GUARDIAS y TAREAS 25 La empresa quiere que todos sus empleados realicen todas las tareas. Realiza un "cross join" 26 En este caso, la empresa quiere que todos los guardias de sexo femenino realicen las tareas de "vigilancia interior" y los de sexo masculino de "vigilancia exterior". Realiza una "cross join" con un "where" que controle tal requisito
Autocombinación (self join) Sobre la tabla COMIDAS Realizamos un cross join consigo misma: select c1.nombre, c2.nombre, c1.precio+c2.precio as total from comidas c1 cross join comidas c2; Observa que aparecen filas duplicadas, por ejemplo, "raviolis" se combina con "raviolis" y la combinación "raviolis- flan" se repite como "flan- raviolis". Debemos especificar que combine la categoría "plato" con "postre": select c1.nombre as "plato principal", c2.nombre as postre, c1.precio+c2.precio as total from comidas c1 cross join comidas c2 where c1.categoria='plato' and c2.categoria='postre'; La salida muestra cada plato combinado con cada postre, y una columna extra que calcula el total del menú. También se puede realizar una autocombinación con join: select c1.nombre as "plato principal", c2.nombre as postre, c1.precio+c2.precio total from comidas c1 join comidas c2 on c1.codigo<>c2.codigo where c1. categoria ='plato' and c2. categoria ='postre'; Sobre la tabla ARTISTAS 27 Combina todas las actrices con los actores mediante un cross join 28 Obten la misma salida anterior pero realizando un join 29 Realice la misma autocombinación, agregando la condición que las parejas no tengan una diferencia superior a 5 años 30 Realiza la misma autocombinación, pero teniendo en cuenta únicamente los casos en que sean de la misma localización select cm.nombre,cm.edad,cv.nombre,cv.edad from clientes cm cross join clientes cv where cm.sexo='f' and cv.sexo='m'; select cm.nombre,cm.edad,cv.nombre,cv.edad from clientes cm join clientes cv on cm.nombre<>cv.nombre where cm.sexo='f' and cv.sexo='m'; select cm.nombre,cm.edad,cv.nombre,cv.edad from clientes cm cross join clientes cv where cm.sexo='f' and cv.sexo='m' and cm.edad-cv.edad between -5 and 5;