Problema:
Una empresa registra los datos de sus empleados en una tabla llamada "empleados".
1- Elimine la tabla "empleados" si existe:
drop table if exists empleados;
2- Cree la tabla:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
sexo char(1),
domicilio varchar(30),
fechaingreso date,
fechanacimiento date,
sueldobasico decimal(5,2) unsigned,
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550,0);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11-06',650,2);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25',510,1);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('30000222','Luis LUque','m','Urquiza 456','1980-09-01','1980-03-29',700,3);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','1965-12-22',400,3);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420,1);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',350,2);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos)
values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05-12',390,0);
insert into empleados
(documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico,hijos)
values ('304154269','Oscar Torres','m','Hernandez 1234','1996-04-10','1978-05-02',400,0);
4- Es política de la empresa festejar cada fin de mes, los cumpleaños de todos los empleados que
cumplen ese mes. Si los empleados son de sexo femenino, se les regala un ramo de rosas, si son de
sexo masculino, una corbata. La secretaria de la Gerencia necesita saber cuántos ramos de rosas y
cuántas corbatas debe comprar para el mes de mayo:
select sexo,count(sexo),
if (sexo='f','rosas','corbata') as 'Obsequio'
from empleados
where month(fechanacimiento)=5
group by sexo;
5- Además, si el empleado cumple 10,20,30,40... años de servicio, se le regala una placa
recordatoria. La secretaria de Gerencia necesita saber la cantidad de años de servicio que cumplen
los empleados que ingresaron en el mes de abril para encargar dichas placas:
select nombre,fechaingreso,
year(current_date)-year(fechaingreso) as 'Años de servicio',
if ( (year(current_date)-year(fechaingreso)) %10=0,'Si','No') as 'Placa'
from empleados
where month(fechaingreso)=4;
6- La empresa paga un sueldo adicional por hijos a cargos. para un sueldo básico menor o igual a
$500 el salario familiar por hijo es de $300, para un sueldo superior, el monto es de $150 por
hijo. Muestre el nombre del empleado, el sueldo básico, la cantidad de hijos a cargo, el valor del
salario por hijo, el valor total del salario familiar y el sueldo final con el salario familiar
incluido de todos los empleados con hijos a cargo:
select nombre,sueldobasico,hijos,
if (sueldobasico<=500,300,150) as salarioporhijo,
if (sueldobasico<=500,300*hijos,150*hijos) as salariofamiliar,
if (sueldobasico<=500,sueldobasico+(300*hijos),sueldobasico+(150*hijos)) as total
from empleados
where hijos>0;
Otros problemas:
A) La empresa que provee de luz a los usuarios de un municipio, almacena en una tabla algunos datos
de los usuarios y el monto a cobrar:
- documento,
- domicilio,
- monto a pagar,
- fecha de vencimiento.
Si la boleta no se paga hasta el día del vencimiento, inclusive, se incrementa al monto, un 1% del
monto cada día de atraso.
1- Elimine la tabla "luz", si existe.
2- Cree la tabla:
create table luz(
documento char(8) not null,
domicilio varchar(30),
monto decimal(5,2) unsigned,
vencimiento date
);
3- Ingrese algunos registros con fechas de vencimiento anterior a la fecha actual (vencidas) y
posteriores a la fecha actual (no vencidas).
4- Ingrese para el mismo usuario (igual documento) 2 boletas vencidas.
5- Muestre el documento del usuario, la fecha de vencimiento, la fecha actual (en que efectúa el
pago) y si debe pagar recargo o no.:
select documento,vencimiento,
current_date as 'Fecha actual',
monto,
if (datediff(current_date,vencimiento)>0,'Si','No') as vencida
from luz;
La función "datediff()" retorna la cantidad de días de diferencia entre las fecha enviadas como
argumento, si el primer argumento es anterior al segundo, el valor retornado es negativo, por ello,
colocamos como condición que el valor retornado por esta función sea mayor a cero, es decir, que la
fecha actual sea posterior a la del vencimiento, así las vencidas mostrarán "Si" y las que no hayan
vencido "No".
6- Si un usuario tiene más de una boleta vencida se le corta el servicio. Muestre el documento y la
cantidad de boletas vencidas de cada usuario que tenga boletas vencidas y muestre un
mensaje "Cortar servicio" si tiene 2 o más vencidas:
select documento,count(*),
if (count(*)>1,'Cortar servicio','') as 'aa'
from luz
where datediff(current_date,vencimiento)>0
group by documento;
B) Un profesor guarda los promedios de sus alumnos de un curso en una tabla llamada "alumnos".
1- Elimine la tabla si existe.
2- cree la tabla:
create table alumnos(
legajo char(5) not null,
nombre varchar(30),
promedio decimal(4,2)
);
3- Ingrese los siguientes registros:
insert into alumnos values(3456,'Perez Luis',8.5);
insert into alumnos values(3556,'Garcia Ana',7.0);
insert into alumnos values(3656,'Ludueña Juan',9.6);
insert into alumnos values(2756,'Moreno Gabriela',4.8);
insert into alumnos values(4856,'Morales Hugo',3.2);
4- Si el alumno tiene un promedio superior o igual a 4, muestre un mensaje "aprobado" en caso
contrario "reprobado":
select legajo,promedio,
if (promedio>=4,'aprobado','reprobado')
from alumnos;
5- Es política del profesor entregar una medalla a quienes tengan un promedio igual o superior a 9.
Muestre los nombres y promedios de los alumnos y un mensaje "medalla" a quienes cumplan con ese
requisito:
select nombre,promedio,
if (promedio>=9,'medalla','')
from alumnos;
C) Una playa de estacionamiento guarda cada día los datos de los vehículos que ingresan a la playa
en una tabla llamada "vehiculos".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table vehiculos(
patente char(6) not null,
tipo char(4),
horallegada time not null,
horasalida time,
primary key(patente,horallegada)
);
3- Ingrese algunos registros:
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('ACD123','auto','8:30','9:40');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('AKL098','auto','8:45','15:10');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('HGF123','auto','9:30','18:40');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('DRT123','auto','15:30',null);
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('FRT545','moto','19:45',null);
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('GTY154','auto','20:30','21:00');
4- Muestre la patente, la hora de llegada y de salida de todos los vehículos, más una columna que
calcule la cantidad de horas que estuvo cada vehículo en la playa, sin considerar los que aún no se
retiraron de la playa:
select patente,horallegada,horasalida,
left(timediff(horasalida,horallegada),5) as horasminutos
from vehiculos
where horasalida is not null;
5- Se cobra 1 peso por hora. Pero si un vehículo permanece en la playa 4 horas, se le cobran 3
pesos, es decir, no se le cobra la cuarta hora; si está 8 horas, se cobran 6 pesos, y así
sucesivamente. Muestre la patente, la hora de llegada y de salida de todos los vehículos, más la
columna que calcule la cantidad de horas que estuvo cada vehículo en la playa (sin considerar los
que aún no se retiraron de la playa) y otra columna utilizando "if" que muestre la cantidad de
horas gratis:
select patente,horallegada,horasalida,
left(timediff(horasalida,horallegada),5) as horasminutos,
if (hour(timediff(horasalida,horallegada))>4,
hour(timediff(horasalida,horallegada)) div 4,0) as horagratis
from vehiculos
where horasalida is not null;
D) Un teatro con varias salas guarda la información de las entradas vendidas en una tabla
llamada "entradas".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table entradas(
sala tinyint unsigned,
fecha date,
hora time,
capacidad smallint unsigned,
entradasvendidas smallint unsigned,
primary key(sala,fecha,hora)
);
3- Ingrese algunos registros:
insert into entradas values(1,'2006-05-10','20:00',300,50);
insert into entradas values(1,'2006-05-10','23:00',300,250);
insert into entradas values(2,'2006-05-10','20:00',400,350);
insert into entradas values(2,'2006-05-11','20:00',400,380);
insert into entradas values(2,'2006-05-11','23:00',400,400);
insert into entradas values(3,'2006-05-12','20:00',350,350);
insert into entradas values(3,'2006-05-12','22:30',350,100);
insert into entradas values(4,'2006-05-12','20:00',250,0);
4- Muestre todos los registros y un mensaje si las entradas para una función están agotadas:
select sala,fecha,hora,
if (capacidad=entradasvendidas,'sala llena',capacidad-entradasvendidas) as 'Entradas disponibles'
from entradas;
5- Muestre todos los datos de las funciones que tienen vendidad entradas y muestre un mensaje si se
vendió más o menos de la mitad de la capacidad de la sala:
select *,
if (entradasvendidas>(capacidad div 2),'mas de la mitad','menos de la mitad vendidas') as vendidas
from entradas
where entradasvendidas>0;