74 - Crear tabla a partir de otras (create - insert - join)


Problema:
Un club dicta clases de distintos deportes a sus socios. Guarda la información de sus socios en 
una tabla llamada "socios", los datos de los deportes en "deportes" y las inscipciones 
en "inscriptos".

1- Elimine las 3 tablas, si existen.

2- Cree las tablas:
 create table socios(
  documento char(8) not null,
  nombre varchar(30) not null,
  primary key(documento)
 );

 create table deportes(
  codigo tinyint unsigned auto_increment,
  nombre varchar(30),
  primary key(codigo)
 );

 create table inscriptos(
  documento char(8) not null,
  codigodeporte tinyint unsigned,
  año year not null,
  cuota char(1), /*'s' o 'n', si esta paga o no*/
  primary key(documento,codigodeporte,año)
 );

3- Ingrese los siguientes registros:
 insert into socios values('22333444','Juan Perez');
 insert into socios values('23333444','Ana Garcia');
 insert into socios values('24333444','Hector Fuentes');
 insert into socios values('25333444','Marta Molina');

 insert into deportes (nombre) values('tenis');
 insert into deportes (nombre) values('natacion');
 insert into deportes (nombre) values('basquet');
 insert into deportes (nombre) values('voley');

 insert into inscriptos values('22333444',1,'2005','s');
 insert into inscriptos values('22333444',1,'2006','s');
 insert into inscriptos values('22333444',2,'2005','s');
 insert into inscriptos values('24333444',1,'2005','s');
 insert into inscriptos values('24333444',2,'2006','s');
 insert into inscriptos values('25333444',1,'2005','s');
 insert into inscriptos values('25333444',1,'2006','s');
 insert into inscriptos values('25333444',3,'2006','s');

4- El club desea saber cuántos socios se han inscripto en cada deporte cada año, considerando sólo 
los deportes que tienen inscripciones:
 select d.nombre,i.año,count(*)
  from deportes as d
  join inscriptos as i
  on d.codigo=i.codigodeporte
  join socios as s
  on i.documento=s.documento
  group by d.nombre,i.año;

5- El club quiere almacenar esa información en una tabla. Elimine la 
tabla "inscriptospordeporteporaño" si existe.

6- Cree la tabla utilizando la sentencia del punto 4:
 create table inscriptospordeporteporaño
  select d.nombre,i.año,count(*)
   from deportes as d
   join inscriptos as i
   on d.codigo=i.codigodeporte
   join socios as s
   on i.documento=s.documento
   group by d.nombre,i.año;

7- Muestre todos los registros de la nueva tabla.

8- El club desea saber cuántas veces se ha inscripto un socio en algún deporte:
 select s.nombre,count(i.documento)
  from socios as s
  left join inscriptos as i
  on s.documento=i.documento
  left join deportes as d
  on i.codigodeporte=d.codigo
  group by s.nombre;

9- Elimine la tabla "sociosdeporte" si existe.

10- Guarde la información del punto 8 en una tabla, creándola a partir de esa consulta:
 create table sociosdeporte
  select s.nombre,count(i.documento) as inscripciones
   from socios as s
   left join inscriptos as i
   on s.documento=i.documento
   left join deportes as d
   on i.codigodeporte=d.codigo
   group by s.nombre;



 

Otros problemas:
A) Una academia de enseñanza dicta distintos cursos de informática. Los cursos se dictan por la 
mañana (de 8 a 12 hs.) o por la tarde (de 16 a 20 hs.), distintos días a la semana. La academia 
guarda los datos de los cursos en una tabla llamada "cursos" en la cual almacena el código del 
curso, el tema, los días de la semana que se dicta, el horario, por la mañana (AM) o por la tarde 
(PM), la cantidad de clases que incluye cada curso (clases), la fecha de inicio y el costo del 
curso. Otra tabla llamada "inscriptos" almacena las inscripciones a los distintos cursos.

1- Elimine las tablas si existen.

2- Cree las tablas:
 create table cursos(
  codigo tinyint unsigned auto_increment,
  tema varchar(20) not null,
  dias set ('lunes','martes','miercoles','jueves','viernes','sabado') not null,
  horario enum ('AM','PM') not null,
  clases tinyint unsigned,
  fechainicio date,
  costo decimal(5,2) unsigned,
  primary key(codigo)
 );
 
 create table inscripciones(
  documento char(8) not null,
  codigocurso tinyint unsigned not null,
  pago char(1), /*'s' si pagó 'n' si no pagó*/
  primary key(documento,codigocurso)
 );

3- Ingrese los siguientes registros:
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('PHP básico','lunes,martes,miercoles','AM',18,'2006-08-07',200);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('PHP básico','lunes,martes,miercoles','PM',18,'2006-08-14',200);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('PHP básico','sabado','AM',18,'2006-08-05',280);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('PHP avanzado','martes,jueves','AM',20,'2006-08-01',350);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('JavaScript','lunes,martes,miercoles','PM',15,'2006-09-11',150);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('Paginas web','martes,jueves','PM',10,'2006-08-08',250);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('Paginas web','sabado','AM',10,'2006-08-12',280);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('Paginas web','lunes,viernes','AM',10,'2006-08-21',200);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('Paginas web','lunes,martes,miercoles,jueves,viernes','AM',10,'2006-09-18',180);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('Paginas web','lunes,viernes','PM',10,'2006-09-25',280);
 insert into cursos (tema, dias,horario,clases,fechainicio,costo)
  values('JavaScript','lunes,martes,viernes,sabado','PM',12,'2006-09-18',150);

 insert into inscripciones values ('22333333',1,'s');
 insert into inscripciones values ('22333333',5,'s');
 insert into inscripciones values ('22333333',6,'n');
 insert into inscripciones values ('23333444',4,'s');
 insert into inscripciones values ('23333444',5,'s');
 insert into inscripciones values ('23333444',7,'s');
 insert into inscripciones values ('24333555',11,'s');
 insert into inscripciones values ('25333666',3,'n');
 insert into inscripciones values ('25333666',7,'n');
 insert into inscripciones values ('26333777',1,'s');
 insert into inscripciones values ('26333777',11,'s');
 insert into inscripciones values ('26333777',10,'s');

4- Muestre la cantidad de inscriptos por tema:
 select c.tema,count(i.documento)
  from cursos as c
  left join inscripciones as i
  on c.codigo=i.codigocurso
  group by c.tema;

5- Elimine la tabla "temas" si existe.

6- Guarde la información obtenida en el punto 5 en una tabla llamada "temas" creando la tabla a 
partir de aquella consulta:
 create table temas
  select c.tema,count(i.documento)
  from cursos as c
  left join inscripciones as i
  on c.codigo=i.codigocurso
  group by c.tema;

7- Vea todos los registros de la tabla creada anteriormente.

8- Visualice la estructura de la tabla "temas".

9- Realice un "join" entre las tablas "cursos" e "inscripciones" mostrando el tema, la cantidad de 
inscriptos y el monto recaudado (por tema del curso):
 select c.tema,c.costo,count(i.codigocurso)as cantidad,
  count(i.codigocurso)*c.costo as total
  from cursos as c
  join inscripciones as i
  on c.codigo=i.codigocurso
  where i.pago='s'
  group by c.tema;

10- Elimine la tabla "recaudacion" si existe.

11- Cree la tabla "recaudacion" con el resultado de la consulta del punto 9:
 create table recaudacion
 select c.tema,c.costo,count(i.codigocurso)as cantidad,
  count(i.codigocurso)*c.costo as total
  from cursos as c
  join inscripciones as i
  on c.codigo=i.codigocurso
  where i.pago='s'
  group by c.tema;

12- Vea todos los registros de la tabla "recaudacion".


B) Una pequeña biblioteca de barrio registra los préstamos de sus libros en una tabla 
llamada "prestamos" y los datos de sus libros en una tabla llamada "libros".

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 prestamos(
  codigolibro int unsigned not null,
  documento char(8) not null,
  fechaprestamo date not null,
  fechadevolucion date,
  primary key(codigolibro,fechaprestamo)
 );

3- Ingrese algunos registros para ambas tablas:
 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 (45,'Aprenda PHP','Mario Molina','Planeta');

 insert into prestamos
  values(15,'22333444','2006-07-10','2006-07-12');
 insert into prestamos
  values(15,'22333444','2006-07-20','2006-07-21');
 insert into prestamos (codigolibro,documento,fechaprestamo)
  values(15,'23333444','2006-07-25');
 insert into prestamos (codigolibro,documento,fechaprestamo)
  values(30,'23333444','2006-07-28');
 insert into prestamos (codigolibro,documento,fechaprestamo)
  values(28,'25333444','2006-08-10');
 insert into prestamos
  values(45,'28333444','2006-08-10','2006-08-12');
 insert into prestamos (codigolibro,documento,fechaprestamo)
  values(45,'25333444','2006-09-10');

4- Muestre los títulos de los libros prestados y no devueltos y en otra columna, si hace más de un 
mes que fue prestado o menos:
 select l.titulo,
  if (adddate(p.fechaprestamo,30)<current_date(),'si','no') as 'Mas de 1 mes' 
  from libros as l
  join prestamos as p
  on l.codigo=p.codigolibro
  where p.fechadevolucion is null;

5- Elimine la tabla "prestados" si existe.

6- Guarde la información del punto 4 en la tabla "prestados" al momento de crearla:
 create table prestados
 select l.titulo,
 if (adddate(p.fechaprestamo,30)<current_date(),'si','no') as 'Mas de 1 mes' 
 from libros as l
 join prestamos as p
 on l.codigo=p.codigolibro
 where p.fechadevolucion is null;

Retornar