jueves, 8 de noviembre de 2012

60 - Funciones de control de flujo (if)


Trabajamos con las tablas "libros" de una librería.

No nos interesa el precio exacto de cada libro, sino si el precio es menor o mayor a $50. Podemos utilizar estas sentencias:

 select titulo from libros
  where precio<50;

 select titulo from libros
  where precio >=50;

En la primera sentencia mostramos los libros con precio menor a 50 y en la segunda los demás.
También podemos usar la función "if".

"if" es una función a la cual se le envían 3 argumentos: el segundo y tercer argumento corresponden a los valores que retornará en caso que el primer argumento (una expresión de comparación) sea "verdadero" o "falso"; es decir, si el primer argumento es verdadero, retorna el segundo argumento, sino retorna el tercero.
Veamos el ejemplo:

 select titulo,
  if (precio>50,'caro','economico')
  from libros;

Si el precio del libro es mayor a 50 (primer argumento del "if"), coloca "caro" (segundo argumento del "if"), en caso contrario coloca "economico" (tercer argumento del "if").

Veamos otros ejemplos.

Queremos mostrar los nombres de los autores y la cantidad de libros de cada uno de ellos; para ello especificamos el nombre del campo a mostrar ("autor"), contamos los libros con "autor" conocido con la función "count()" y agrupamos por nombre de autor:

 select autor, count(*)
  from libros
  group by autor;

El resultado nos muestra cada autor y la cantidad de libros de cada uno de ellos. Si solamente queremos mostrar los autores que tienen más de 1 libro, es decir, la cantidad mayor a 1, podemos usar esta sentencia:

 select autor, count(*)
  from libros
  group by autor
  having count(*)>1;

Pero si no queremos la cantidad exacta sino solamente saber si cada autor tiene más de 1 libro, podemos usar "if":

 select autor,
  if (count(*)>1,'Más de 1','1')
  from libros
  group by autor;

Si la cantidad de libros de cada autor es mayor a 1 (primer argumento del "if"), coloca "Más de 1" (segundo argumento del "if"), en caso contrario coloca "1" (tercer argumento del "if").

Queremos saber si la cantidad de libros por editorial supera los 4 o no:

 select editorial,
  if (count(*)>4,'5 o más','menos de 5') as cantidad
  from libros
  group by editorial
  order by cantidad;

Si la cantidad de libros de cada editorial es mayor a 4 (primer argumento del "if"), coloca "5 o más" (segundo argumento del "if"), en caso contrario coloca "menos de 5" (tercer argumento del "if").


PROBLEMA RESUELTO

Trabajamos con las tablas "libros" de una librería.

Eliminamos la tabla, si existe.

Creamos la tabla:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(30),
  precio decimal(5,2) unsigned,
  primary key (codigo)
 );

Ingresamos algunos registros:

 insert into libros (titulo, autor,editorial,precio)
  values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',50.5);
 insert into libros (titulo, autor,editorial,precio)
  values('Alicia a traves del espejo','Lewis Carroll','Emece',25);
 insert into libros (titulo, autor,editorial,precio) 
  values('El aleph','Borges','Paidos',15);
 insert into libros (titulo, autor,editorial,precio)
  values('Matemática estas ahi','Paenza','Paidos',10);
 insert into libros (titulo, autor,editorial)
  values('Antologia','Borges','Paidos');
 insert into libros (titulo, editorial)
  values('El gato con botas','Paidos');
 insert into libros (titulo, autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Emece',90);

No nos interesa el precio exacto de cada libro, sino si el precio es menor o mayor a $50. Podemos utilizar estas sentencias:

 select titulo from libros
  where precio<50;

 select titulo from libros
  where precio >=50;

En la primera sentencia mostramos los libros con precio menor a 50 y en la segunda los demás.

Usamos la función "if":

 select titulo,
  if (precio>50,'caro','economico')
  from libros;

Si el precio del libro es mayor a 50 (primer argumento del "if"), coloca "caro" (segundo argumento del "if"), en caso contrario coloca "economico" (tercer argumento del "if").

Queremos mostrar los nombres de los autores y la cantidad de libros de cada uno de ellos; para ello especificamos el nombre del campo a mostrar ("autor"), contamos los libros con "autor" conocido con la función "count()" y agrupamos por nombre de autor:

 select autor, count(*)
  from libros
  group by autor;

El resultado nos muestra cada autor y la cantidad de libros de cada uno de ellos. Si solamente queremos mostrar los autores que tienen más de 1 libro, es decir, la cantidad mayor a 1, podemos usar esta sentencia:

 select autor, count(*)
  from libros
  group by autor
  having count(*)>1;

Pero si no queremos la cantidad exacta sino solamente saber si cada autor tiene más de 1 libro, podemos usar "if":

 select autor,
  if (count(*)>1,'Más de 1','1')
  from libros
  group by autor;

Si la cantidad de libros de cada autor es mayor a 1 (primer argumento del "if"), coloca "Más de 1" (segundo argumento del "if"), en caso contrario coloca "1" (tercer argumento del "if").
Podemos ordenar por la columna del "if":

 select autor,
  if (count(*)>1,'Más de 1','1') as cantidad
  from libros
  group by autor
  order by cantidad;

Para saber si la cantidad de libros por editorial supera los 4 o es menor:

 select editorial,
  if (count(*)>4,'5 o más','menos de 5') as cantidad
  from libros
  group by editorial
  order by cantidad;

Si la cantidad de libros de cada editorial es mayor a 4 (primer argumento del "if"), coloca "5 o más" (segundo argumento del "if"), en caso contrario coloca "menos de 5" (tercer argumento del "if").

Además, la sentencia ordena la salida por el alias "cantidad".



PROBLEMA PROPUESTO


Una empresa registra los datos de sus empleados en una tabla llamada "empleados".

1- Elimine la tabla "empleados" si existe:

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:
 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:
 
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:
 


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.:
 
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:
 

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":
 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:
 
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:
 
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:
 

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:
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:
 

5 comentarios:

  1. buen dia, alguien tendrá los resultados de estos ejercicios

    ResponderEliminar
  2. Profesor Gurrola no use esta pagina para dejar trabajos atte:Jose Luis Salazar Serrano :v

    ResponderEliminar
  3. Profesor Gurrola no use esta pagina para dejar trabajos atte:Jose Luis Salazar Serrano :v

    ResponderEliminar