Está en la página 1de 4

CREATE TABLE libro(

libro NUMBER(5) PRIMARY KEY,


titulo CHAR(30) NOT NULL,
autor CHAR(30),
numpag NUMBER(4));
CREATE TABLE socio(
socio NUMBER(5) PRIMARY KEY,
nombre CHAR(30) NOT NULL,
telefono CHAR(10),
falta DATE);

CREATE TABLE prestamo(


libro NUMBER(5) NOT NULL,
socio NUMBER(5) NOT NULL,
fprestamo DATE NOT NULL,
fdevolucion DATE,
PRIMARY KEY (libro,socio,fprestamo),
FOREIGN KEY (libro) REFERENCES libro,
FOREIGN KEY (socio) REFERENCES socio);

Datos-Tabla libro
Cada l�nea contiene la informaci�n relativa a un libro:

1, La Leccion, E.Ionesco, 155


2, El libro de la reposteria, Angela Landa, 166
3, Hamlet, Shakespeare, 150
4, Discurso del metodo, R.Descartes, 182
5, El libro de arena, J.L.Borges, 121
6, Una dama en apuros, T. Sharpe, 255
7, La Republica o el Estado, Platon, 303
8, Job, J.Roth, 189
9, El viejo y el mar, E.Hemingwey, 154
10, En las profundidades, A.C.Clarke, 196.
Datos-Tabla Socio
Cada l�nea contiene la informaci�n relativa a un socio:

1, Juan Perez Lozano, 617315863, 26-mar-99


2, Luis Romero Sanchez,959253987, 13-jun-00
3, Pedro Lopez Rojas, 954553153, 10-may-01
4, Santiago Gonzalez Lleida, 954435993,19-mar-00
5, Fernando Domingo Gomez, 955634281, 28-jan-02
6, Luis Daza Zamora, 954435113, 29-oct-00
7, Antonio Ossorio Melgar, 609257167, 17-jul-01
8, Javier Romero Gonzalez, 617583100, 05-may-05
Datos-Tabla Prestamos
Cada l�nea contiene la informaci�n relativa a un pr�stamo:libro, socio, fecha de
pr�stamo y fecha de devoluci�n (en su caso).

8, 8, 02-may-02, 31-dec-02
4, 8, 21-apr-02, 31-dec-02
4, 1, 15-mar-02, 19-apr-02
1, 2, 30-apr-02, 31-dec-02
8, 3, 08-may-02, 31-dec-02
5, 3, 15-jan-02, 19-jan-02
5, 3, 22-jan-02, 31-jan-02
5, 3, 02-feb-02, 15-feb-02
4, 7, 15-mar-02, 18-mar-02
4, 7, 05-apr-02, 20-apr-02
1, 7, 06-may-02, 31-dec-02
3, 2, 10-may-02, 31-dec-02
5, 2, 01-may-02, 31-dec-02

Consultas
1. Calcular cu�ntos socios se han dado de alta en el a�o 2000.
SELECT COUNT(*) FROM socio WHERE
falta BETWEEN '1-JAN-00' AND '31-DEC-00';

2. Averiguar los pr�stamos que han tenido una duraci�n superior a diez d�as.
Considerar �nicamente aquellos pr�stamos ya finalizados.

SELECT * from prestamo WHERE fdevolucion - fprestamo > 10;

3. Idem pero incorporando a la salida el t�tulo del libro y el nombre del socio de
los pr�stamos, restringidos a los pr�stamos ya finalizados.

SELECT titulo, nombre, fprestamo, fdevolucion


FROM libro, socio, prestamo
WHERE fdevolucion - fprestamo > 10 AND
prestamo.libro = libro.libro AND
prestamo.socio = socio.socio;

4. Averiguar los pr�stamos con una duraci�n superior a diez d�as pero considerando
ahora tambi�n los pr�stamos que a�n no han terminado.

SELECT * from prestamo WHERE


(fdevolucion - fprestamo = 10) OR
(fdevolucion = '31-dec-02' AND SYSDATE - fprestamo > 10);

5. Otorgando un plazo de lectura de 15 d�as, obtener los pr�stamos que expiran en


los pr�ximos tres d�as.

SELECT * from prestamo WHERE


fdevolucion = '31-dec-02' AND
SYSDATE +3 - fprestamo > 15;

6. Listar los nombres de los socios que han retirado en pr�stamo el libro n�mero 4
alguna vez.

SELECT DISTINCT(nombre) FROM socio, prestamo WHERE


libro = 4 AND prestamo.socio = socio.socio;
SELECT nombre FROM socio WHERE socio IN
(SELECT socio FROM prestamo WHERE libro=4);

Las dos consultas anteriores producen el mismo resultado pero con los nombres de
los socios listados en diferente orden. La cl�usula DISTINCT de la primera consulta
es necesaria para no incluir en la salida un mismo nombre m�s de una vez si un
socio obtiene en pr�stamo el libro n�mero 4 en varias ocasiones. El operador
conjuntista IN en la segunda consulta imposibilita la aparici�n de duplicados.

7. Idem, pero a�adiendo cu�ntas veces ha sacado cada socio dicho libro.

SELECT nombre, COUNT(*) FROM socio, prestamo WHERE


libro = 4 AND prestamo.socio = socio.socio
GROUP BY nombre;

8. Calcular el n�mero de socios que han sacado alguno de los libros prestados al
socio n�mero 8.
SELECT COUNT(*) FROM prestamo WHERE libro IN
(SELECT libro FROM prestamo WHERE socio = 8);

El resultado producido por la consulta anterior no es correcto, pues se cuentan


varias veces los casos en que un mismo socio haya sacado alguno de esos libros m�s
de una vez. Para obtener el resultado correcto hay que calcular el n�mero de
c�digos de socio diferentes que han sacado esos libros.

SELECT COUNT(DISTINCT(socio)) FROM prestamo WHERE libro IN


(SELECT libro FROM prestamo WHERE socio = 8);

9. Idem, pero sin considerar los pr�stamos realizados antes de que el socio n�mero
8 retirara por primera vez un libro.

SELECT COUNT(DISTINCT(socio)) FROM prestamo WHERE libro IN


(SELECT libro FROM prestamo WHERE socio = 8)
AND fprestamo >=
(SELECT MIN(fprestamo) FROM prestamo WHERE socio = 8);

10. N�mero de libros prestados en la actualidad.

SELECT COUNT(*) FROM prestamo WHERE fdevolucion = '31-dec-02';

11. N�mero de socios con alg�n libro prestado actualmente.

SELECT COUNT(DISTINCT(socio)) FROM prestamo WHERE fdevolucion = '31-dec-02;

12. Averiguar los libros que actualmente est�n prestados.

SELECT titulo FROM libro, prestamo WHERE


fdevolucion = '31-dec-02' AND prestamo.libro = libro.libro;
SELECT titulo FROM libro WHERE libro IN
(SELECT libro FROM prestamo WHERE fdevolucion = '31-dec-02);

Las dos consultas producen el mismo resultado pero en diferente orden.

13. Averiguar qu� socios no han sacado nunca ning�n libro.

(SELECT socio FROM socio) MINUS (SELECT socio FROM prestamo);

14. Calcular el n�mero medio de libros retirados en pr�stamo por los socios,
considerando �nicamente aquellos socios que alguna vez han sacado un libro.

SELECT COUNT(*) / COUNT(DISTINCT(socio)) AS media FROM prestamo;

15. Averiguar cu�ntos pr�stamos de libros ha realizado cada socio.

SELECT socio, COUNT(*) FROM prestamo GROUP BY socio;

16. Averiguar cu�ntos libros diferentes ha recibido en pr�stamo cada socio.

SELECT socio, COUNT(DISTINCT(libro)) FROM prestamo GROUP BY socio;

17. Averiguar cu�ntas veces se ha prestado cada libro.

SELECT libro, COUNT(*) FROM prestamo GROUP BY libro;


18. Averiguar los socios que han sacado m�s de una vez un mismo libro.

SELECT socio FROM prestamo


GROUP BY socio, libro
HAVING COUNT(*) > 1;
SELECT socio FROM prestamo
GROUP BY socio
HAVING COUNT(*) - COUNT(DISTINCT(libro)) > 0;

Una informaci�n m�s completa puede obtenerse con la siguiente consulta:

SELECT socio, libro, COUNT(*) FROM prestamo


GROUP BY socio, libro
HAVING COUNT(*) > 1;

19. Obtener el socio (puede haber varios) que haya realizado un mayor n�mero de
pr�stamos.

SELECT socio FROM prestamo


GROUP BY socio
HAVING COUNT(*) =
(SELECT MAX(COUNT(*)) FROM prestamo GROUP BY socio);

También podría gustarte