Problema:
Un club de dicta clases de distintos deportes a sus socios. Guarda la información de sus socios en
una tabla llamada "socios" y las inscripciones en "inscriptos".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table socios(
numero int unsigned auto_increment,
documento char(8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
primary key(numero)
);
create table inscriptos(
numerosocio int unsigned,
deporte varchar(20),
año year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(numerosocio,deporte,año)
);
3- Ingrese los siguientes registros:
insert into socios values(23,'22333444','Juan Perez','Colon 123');
insert into socios values(56,'23333444','Ana Garcia','Sarmiento 984');
insert into socios values(102,'24333444','Hector Fuentes','Sucre 293');
insert into socios values(150,'25333444','Agustin Perez','Avellaneda 1234');
insert into socios values(230,'26333444','Maria Perez','Urquiza 283');
insert into socios values(231,'29333444','Agustin Perez','Urquiza 283');
insert into inscriptos values(23,'tenis','2015','s');
insert into inscriptos values(23,'tenis','2016','s');
insert into inscriptos values(23,'natacion','2015','s');
insert into inscriptos values(102,'tenis','2015','s');
insert into inscriptos values(102,'natacion','2016','s');
4- El socio con documento "23333444" quiere inscribirse en "basquet" este año, pero no recuerda su
número de socio. Inscriba al socio en la tabla "inscriptos" buscando en la tabla "socios" el número
de socio a partir del número de documento:
insert into inscriptos (numerosocio,deporte,año,cuota)
select numero,'tenis','2016','s'
from socios
where documento='23333444';
5- Intente inscribir una persona cuyo número de documento no exista en la tabla "socios":
insert into inscriptos (numerosocio,deporte,año,cuota)
select numero,'tenis','2016','s'
from socios
where documento='30333444';
No se realiza la inserción porque no encuentra el documento en la tabla "socios".
6- La madre de los socios "Perez" quiere inscribir a su hijo "Agustín" en "basquet" este año, pero
no recuerda su número de socio ni su documento. Si se busca el número de socio a partir del nombre
("Agustin Perez"), la consulta retornará 2 registros, porque hay 2 socios llamados "Agustin Perez".
Obtendremos como resultado, la inscripción a "basquet" este año, de ambos socios. Si localizamos el
número de socio a partir del domicilio ("Urquiza 283"), también obtendremos 2 inscripciones, porque
hay 2 socios con ese domicilio. Ingrese la inscripción del socio, localizando su número de socio
con el nombre y domicilio:
insert into inscriptos (numerosocio,deporte,año,cuota)
select numero,'basquet','2016','n'
from socios
where nombre='Agustin Perez' and
domicilio='Urquiza 283';
7- La madre de los socios "Perez" quiere inscribir a ambos hijos "natacion" este año, pero no
recuerda sus números de socio ni sus documentos. Inscriba a ambos localizando sus números de socio
con el domicilio:
insert into inscriptos (numerosocio,deporte,año,cuota)
select numero,'natacion','2016','n'
from socios
where domicilio='Urquiza 283';
8- Vea si las inscripciones anteriores se cargaron:
select s.nombre,i.deporte,i.año
from socios as s
join inscriptos as i
on s.numero=i.numerosocio;
Otros problemas:
A) Una biblioteca registra los préstamos de sus libros en una tabla llamada "prestamos", los datos
de sus libros en una tabla llamada "libros" y los datos de sus socios en "socios".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40),
autor varchar (30),
editorial varchar (15),
primary key (codigo)
);
create table socios(
numero int unsigned auto_increment,
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key (numero)
);
create table prestamos(
codigolibro int unsigned not null,
numerosocio int not null,
fechaprestamo date not null,
fechadevolucion date,
primary key(codigolibro,fechaprestamo)
);
3- Ingrese algunos registros para las 3 tablas:
insert into socios values(20,'20222000','Juan Perez','Colon 123');
insert into socios values(31,'25222111','Juan Perez','Sucre 34');
insert into socios values(52,'25333222','Ana Maria Lopez','Avellaneda 235');
insert into socios values(82,'28333222','Luisa Duarte','San Martin 877');
insert into socios values(90,'29333222','Carlos Fuentes','Rivadavia 864');
insert into libros values (15,'Manual de 1º grado','Moreno Luis','Emece');
insert into libros values (28,'Manual de 2º grado','Moreno Luis','Emece');
insert into libros values (30,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta');
insert into libros values (35,'El aleph','Borges','Emece');
insert into libros values (36,'Aprenda PHP','Molina Marcos','Planeta');
insert into libros values (40,'Cervantes y el quijote','Borges','Paidos');
insert into libros values (46,'Aprenda Java','Molina Marcos','Planeta');
insert into prestamos values(15,20,'2016-07-10','2016-07-12');
insert into prestamos values(15,31,'2016-07-12','2016-07-15');
insert into prestamos values(15,20,'2016-07-18',null);
insert into prestamos values(28,20,'2016-07-15',null);
insert into prestamos values(30,20,'2016-07-20',null);
insert into prestamos values(35,31,'2016-07-20','2016-07-22');
insert into prestamos values(36,90,'2016-07-25','2016-07-26');
4- El socio con número de documento "25333222" solicita en préstamos el libro con código 40. El
socio no recuerda su número de socio pero si su documento. Ingrese el préstamo ubicando el número
de socio a partir del documento en "socios":
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 40,numero,'2016-09-15'
from socios
where documento='25333222';
5- El socio llamado "Juan Perez" solicita el libro código 35; no recuerda su número de socio ni su
número de documento. Intente ingresar el registro localizando el número de socio a partir del
nombre:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 35,numero,'2016-09-16'
from socios
where nombre='Juan Perez';
Aparece un mensaje de error indicando que la clave se duplica; porque la consulta retorna 2
registros (hay 2 socios con igual nombre), MySQL intenta insertar 2 registros iguales en todos los
valores excepto en el número de documento, pero no se pueden ingresar 2 registros con el mismo
código de libro en la misma fecha (clave primaria). Resuelva el problema, ingrese el préstamo
colocando las condiciones necesarias para que la consulta retorne solamente una fila:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 35,numero,'2016-09-16'
from socios
where nombre='Juan Perez' and
domicilio='Sucre 34';
6- Seleccione el documento y nombre de todos los morosos (una vez cada socio):
select distinct s.documento,s.nombre
from socios as s
join prestamos as p
on s.numero=p.numerosocio
where fechadevolucion is null;
7- La biblioteca necesita una tabla en la cual almacene el documento y nombre de los socios
morosos. Elimine la tabla "morosos" si existe:
drop table if exists morosos;
8- Cree la tabla "morosos" a partir de la consulta realizada en el punto 6:
create table morosos
select distinct s.documento,s.nombre
from socios as s
join prestamos as p
on s.numero=p.numerosocio
where fechadevolucion is null;
9- Muestre los números de socio, documento y nombre de todos los socios que no son deudores,
empleando un "left join" entre las tablas "socios" y "morosos":
select s.numero,s.documento,s.nombre
from socios as s
left join morosos as m
on s.documento=m.documento
where m.documento is null;
10- El socio con documento "20222000" solicita el préstamo de un libro. El socio no recuerda su
número pero si su documento. Se desea realizar el préstamo sólo si dicho socio no se encuentra
en "morosos". Realice una consulta a la tabla "socios" y "morosos" que retorne los números de socio
de aquellos socios que no adeudan libros y luego busque en dicho resultado el valor del número de
socio a partir del documento, si encuentra coincidencia, ingresará el registro, en caso contrario
(la persona es un socio es deudor o no es socio), la inserción no se realiza:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 15,s.documento,'2016-07-28'
from socios as s
left join morosos as m
on s.documento=m.documento
where m.documento is null
and s.documento='20222000';
No se realizó la carga del préstamo porque no encontró el documento en el resultado de la consulta.
11- El socio con documento "29333222" solicita el préstamo de un libro. El socio no recuerda su
número pero si su documento. Se desea realizar el préstamo sólo si dicho socio no se encuentra
en "morosos". Realice una consulta a la tabla "socios" y "morosos" que retorne los números de socio
de aquellos socios que no adeudan libros y luego busque en dicho resultado el valor del número de
socio a partir del documento:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 36,s.numero,'2016-07-28'
from socios as s
left join morosos as m
on s.documento=m.documento
where m.documento is null
and s.documento='29333222';
La inserción se realizó porque el documento del socio buscado se encontró en la consulta de "no
morosos".
12- Coloque fecha de devolución al libro con código "36" prestado el día "2016-07-28":
update prestamos
set fechadevolucion='2016-07-29'
where codigolibro=36 and
fechaprestamo='2016-07-28';
13- Muestre el código y nombre de todos los libros que no han sido devueltos:
select l.codigo,l.titulo
from libros as l
left join prestamos as p
on p.codigolibro=l.codigo
where p.fechaprestamo is not null and
fechadevolucion is null;
14- la biblioteca desea crear una tabla llamada "librosausentes" en la que guarde el código y
título de los libros no devueltos. Elimine la tabla "librosausentes" si existe:
drop table if exists librosausentes;
15- Cree la tabla a partir de la consulta del punto 13:
create table librosausentes
select l.codigo,l.titulo
from libros as l
left join prestamos as p
on p.codigolibro=l.codigo
where p.fechaprestamo is not null and
fechadevolucion is null;
16- Realice un "left join" entre las tablas "libros" y "librosausentes" mostrando los códigos y
títulos de los libros presentes:
select l.codigo,l.titulo
from libros as l
left join librosausentes as la
on la.codigo=l.codigo
where la.codigo is null;
17- El socio número 82 quiere llevar el libro código "35", ingrese el registro en "prestamos" sólo
si al buscar el código en el resultado de la consulta anterior encuentra coincidencia, es decir, si
el libro está presente:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select l.codigo,82,'2016-09-17'
from libros as l
left join librosausentes as la
on la.codigo=l.codigo
where la.codigo is null and
l.codigo=35;
No se realiza la inserción del registro porque el libro está prestado.
18- El mismo socio intenta llevar el libro con código "36". Realice la misma consulta:
select l.codigo,82,'2016-09-17'
from libros as l
left join librosausentes as la
on la.codigo=l.codigo
where la.codigo is null and
l.codigo=36;
El registro se cargó porque el libro está presente.
B) Un instituto de enseñanza guarda en una tabla llamada "carreras" los datos de las carreras que
dicta, en "materias" las materias de cada carrera y en "inscriptos" las inscripciones.
1- Elimine las 3 tablas, si existen.
2- Cree las tablas con las siguientes estructuras:
create table carreras(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
primary key(codigo)
);
create table materias(
codigo tinyint unsigned auto_increment,
codigocarrera tinyint unsigned,
nombre varchar(30),
profesor varchar(30),
primary key(codigo,codigocarrera)
);
create table inscriptos(
documento char(8) not null,
codigocarrera tinyint unsigned,
codigomateria tinyint unsigned,
año year,
cuota char(1),/* si esta paga o no*/
primary key (documento,codigocarrera,codigomateria,año)
);
3- Ingrese algunos registros:
insert into carreras values(1,'Analista de sistemas');
insert into carreras values(2,'Diseñador web');
insert into materias values(1,1,'Programacion I','Alfredo Lopez');
insert into materias values(2,1,'Sistemas de datos I','Bernardo Garcia');
insert into materias values(3,1,'Ingles tecnico','Edit Torres');
insert into materias values(1,2,'Programacion basica','Alfredo Lopez');
insert into materias values(2,2,'Ingles I','Edit Torres');
insert into materias values(3,2,'Protocolos','Hector Juarez');
insert into inscriptos values('22333444',1,1,'2015','s');
insert into inscriptos values('22333444',1,2,'2015','s');
insert into inscriptos values('22333444',1,3,'2016','n');
insert into inscriptos values('23222222',1,1,'2015','s');
insert into inscriptos values('23222222',1,2,'2016','s');
insert into inscriptos values('24555666',1,1,'2015','s');
insert into inscriptos values('24555666',2,1,'2015','s');
insert into inscriptos values('25000999',1,1,'2015','s');
insert into inscriptos values('25000999',1,2,'2015','s');
insert into inscriptos values('25000999',2,1,'2016','n');
insert into inscriptos values('25000999',2,2,'2016','s');
4- Muestre todos los datos de la tabla "inscriptos" (sin códigos) incluyendo los nombres de las
materias y carreras:
select i.documento,c.nombre,m.nombre,año,cuota
from inscriptos as i
join carreras as c
on c.codigo=i.codigocarrera
join materias as m
on m.codigo=i.codigomateria and
m.codigocarrera=c.codigo;
5- Se quiere inscribir un alumno en la materia "Programacion basica" de la carrera "Diseñador web"
pero la secretaria no recuerda los códigos de las mismas. Inscriba al alumno consultando los
valores de las tablas "carreras" y "materias":
insert into inscriptos (documento,codigocarrera,codigomateria,año,cuota)
select '30222333',c.codigo,m.codigo,'2016','s'
from carreras as c
join materias as m
on c.codigo=m.codigocarrera
where c.nombre='Diseñador web' and
m.nombre='Programacion basica';