Está en la página 1de 3

SESIÓN 5 – SUBSELECT.

PREDICADOS DE
COMPARACIÓN. DIVISIÓN DE SQL
1) Listar el nombre y apellidos de todos los lectores de la provincia de Cáceres que
tienen una fecha de nacimiento anterior a la de:
a. Alguno de los lectores de la provincia de Zamora.
select * from lector where provincia='CACERES' and fecha_nac < ANY (select
fecha_nac from lector where provincia='ZAMORA' );
b. Cualquiera de los lectores de la provincia de Zamora.
select * from lector where provincia='CACERES' and fecha_nac < ALL (select
fecha_nac from lector where provincia='ZAMORA' );
select * from lector where provincia='CACERES' and fecha_nac <  (select
min(fecha_nac) from lector where provincia='ZAMORA' );

2) Lectores que hayan nacido en una fecha posterior a la de todos los autores.
select * from lector where to_char(fecha_nac,'yyyy')> all (select ano_nac from autor
where ano_nac>0);
3) Autores de la nacionalidad de ISABEL ALLENDE y que hayan nacido en el mismo año
que CARMEN POSADAS.
select * from autor where cod_nacion = (select cod_nacion from autor where
nombre='ISABEL' and apellido='ALLENDE') and ano_nac = (select ano_nac from
autor where nombre='CARMEN' and apellido='POSADAS');
4) Autores que hayan nacido en una fecha posterior a alguno de los lectores.
select nombre, apellido from autor where ano_nac is not null and ano_nac > ANY
(select to_char(fecha_nac, 'yyyy') from lector);
5) Datos de la sucursal/sucursales que tiene el mayor número de préstamos.
select * from sucursal where codigo in (select cod_suc from prestamo group by
cod_suc having count(codigo)= (select max(count(codigo)) from prestamo group by
cod_suc));
6) Datos del/los lector/s que realizó durante el año pasado el mayor número de
préstamos.
select * from lector where codigo in (select cod_lector from prestamo group by
cod_lector having count(codigo)= (select max(count(codigo)) from prestamo group
by cod_lector));
7) Obtener el listado del autor/es con más libros, indicando el número.
select cod_autor, nombre, apellido, count(e.isbn) from autor a, escribe e where
a.codigo=cod_autor group by cod_autor, nombre, apellido having count(e.isbn) =
(select max(count(e.isbn)) from escribe e group by cod_autor);
8) Datos del lector de más edad de la red de bibliotecas.
select * from lector where fecha_nac >= all (select fecha_nac from lector);
9) Datos de los lectores de más edad de cada provincia.
select * from lector l1 where fecha_nac >= all (select fecha_nac from lector l2 where
l1.provincia=l2.provincia);
10) Verifique si existe algún libro que no haya sido nunca cogido en préstamo en alguna
sucursal. Si existe proporcione título del libro y la sucursal/es a la que pertenece.
/*Se sacan los títulos de los libros nunca prestados, pero no sucursales*/
select * from libro l where not exists (select * from prestamo where isbn=l.isbn);
/*Sacamos las sucursales a las que pertenecen*/
select * from dispone where isbn in (select isbn from libro l where not exists (select *
from prestamo where isbn=l.isbn));
11) Verifique si existe algún libro que no haya sido nunca cogido en préstamo en ninguna
sucursal. Si existe proporcione título del libro.
select distinct titulo from libro l, dispone d where l.isbn=d.isbn and not exists (select
* from prestamo p where p.isbn=d.isbn);
12) Nombre de los autores más antiguos de su nacionalidad, indicando el autor y la
nacionalidad.
select * from autor a where ano_nac <=ALL (select ano_nac from autor aa where
a.cod_nacion=aa.cod_nacion) order by 6;

/*Indicamos el autor y la nacionalidad*/


select n. nombre, a.nombre, a.apellido from autor a join nacionalidad n on
n.codigo=a.cod_nacion where ano_nac <=ALL (select ano_nac from autor aa where
a.cod_nacion=aa.cod_nacion) order by 1;

//0tro
select cod_nacion, a1.nombre, apellido, n.nombre from autor a1, nacionalidad n
where a1.cod_nacion=n.codigo and ano_nac<= all(select ano_nac from autor a2
where a1.cod_nacion=a2.cod_nacion);
13) Presentar un listado de sucursales indicando el libro que más ejemplares tiene.
select cod_suc, titulo from libro l, dispone d1 where l.isbn=d1.isbn and
num_ejemplares = (select max(num_ejemplares) from dispone d2 where
d1.cod_suc=d2.cod_suc);
14) Presentar un listado de todos los lectores que no hayan realizado préstamos.
select * from lector l where not exists (select * from prestamo where
l.codigo=cod_lector);
15) Obtener las localidades en las que viven lectores y no existan sucursales.
select l.poblacion from lector l where not exists (select * from sucursal s where
s.poblacion=l.poblacion);
16) Nombre de los lectores que han obtenido préstamos en todas las sucursales.
select nombre, ape_1, ape_2 from lector l where not exists (select * from dispone d
where not exists (select * from prestamo p where p.cod_suc=d.cod_suc and
p.cod_lector=l.codigo));
17) Nombre de los lectores que han obtenido préstamos en todas las sucursales de su
provincia de residencia.
select nombre, ape_1, ape_2 from lector l where not exists (select * from sucursal s
where s.provincia=l.provincia and not exists(select * from prestamo p where
p.cod_lector=l.codigo and s.codigo=p.cod_suc));
18) Listar los ISBN de los libros disponibles en la sucursal 5 en un nº superior al del libro
con ISBN 5024392.
select isbn from dispone d where num_disponibles>0 and cod_suc=5 and
num_disponibles > (select num_disponibles from dispone where isbn=5024392 and
cod_suc=5);
19) Presentar un listado de los lectores que tienen más préstamos en cada sucursal
indicando el número de préstamos realizados ordenado por sucursal y listado
alfabético de apellidos y nombre de dichos lectores.
select cod_suc, nombre, ape_1, ape_2, count(p1.codigo) from lector l, prestamo p1
where l.codigo=cod_lector group by nombre, ape_1,ape_2,cod_suc having
count(p1.codigo) = (select max(count(codigo)) from prestamo p2 where
p1.cod_suc=p2.cod_suc group by cod_lector) order by cod_suc, ape_1, ape_2,
nombre;

También podría gustarte