domingo, 5 de mayo de 2013

61 - Funciones de control de flujo (case)



La función "case" es similar a la función "if", sólo que se pueden establecer varias condiciones a cumplir.
Trabajemos con la tabla "libros" de una librería.

Queremos saber si la cantidad de libros de cada editorial es menor o mayor a 1, tipeamos:

 select editorial,
  if (count(*)>1,'Mas de 2','1') as 'cantidad'
  from libros
  group by editorial;
 
vemos los nombres de las editoriales y una columna "cantidad" que especifica si hay más o menos de uno. Podemos obtener la misma salida usando un "case":

 select editorial,
  case count(*)
   when 1 then 1
   else 'mas de 1' end as 'cantidad'
  from libros
  group by editorial;
 
Por cada valor hay un "when" y un "then"; si encuentra un valor coincidente en algún "where" ejecuta el "then" correspondiente a ese "where", si no encuentra ninguna coincidencia, se ejecuta el "else", si no hay parte "else" retorna "null". Finalmente se coloca "end" para indicar que el "case" ha finalizado.

Entonces, la sintaxis es:

 case  
  when  then 
  ...
  else  end
 
Se puede obviar la parte "else":

 select editorial,
  case count(*)
   when 1 then 1
   end as 'cantidad'
  from libros
  group by editorial;
 
Con el "if" solamente podemos obtener dos salidas, cuando la condición resulta verdadera y cuando es falsa, si queremos más opciones podemos usar "case". Vamos a extender el "case" anterior para mostrar distintos mensajes:

 select editorial,
  case count(*)
   when 1 then 1
   when 2 then 2
   when 3 then 3
  else 'Más de 3' end as 'cantidad'
  from libros
  group by editorial;
 
Incluso podemos agregar una cláusula "order by" y ordenar la salida por la columna "cantidad":

 select editorial,
  case count(*)
   when 1 then 1
   when 2 then 2
   when 3 then 3
  else 'Más de 3' end as 'cantidad'
  from libros
  group by editorial
  order by cantidad;
 
La diferencia con "if" es que el "case" toma valores puntuales, no expresiones. La siguiente sentencia provocará un error:

 select editorial,
  case count(*)
   when 1 then 1
   when >1 then 'mas de 1'
  end as 'cantidad'
  from libros
  group by editorial;
 
Pero existe otra sintaxis de "case" que permite condiciones:

 case
  when  then 
  ...
  else 
 end
 
Veamos un ejemplo:

 select editorial,
  case
   when count(*)=1 then 1
   else 'mas de uno'
  end as cantidad
  from libros
  group by editorial;
 
 
 
PROBLEMA RESUELTO 
 




Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla si existe:
 drop table if exists libros;
Creamos la tabla:
 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(20),
  precio decimal(5,2) unsigned,
  cantidad smallint unsigned,
  primary key(codigo)
 );
Ingresamos algunos registros:
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('El aleph','Borges','Planeta',34.5,100);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Alicia en el pais de las maravillas','Carroll L.','Paidos',20.7,50);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('harry Potter y la camara secreta',null,'Emece',35,500);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Aprenda PHP','Molina Mario','Planeta',54,100);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Harry Potter y la piedra filosofal',null,'Emece',38,500);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Aprenda Java','Molina Mario','Planeta',55,100);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Aprenda JavaScript','Molina Mario','Planeta',58,150);
Queremos saber si la cantidad de libros de cada editorial es menor o mayor a 1 empleando "case":
 select editorial,
  case count(*)
   when 1 then 1
   else 'mas de 1' end as 'cantidad'
  from libros
  group by editorial;
Por cada valor hay un "when" y un "then"; si encuentra un valor coincidente en algún "where" ejecuta el "then" correspondiente a ese "where", si no encuentra ninguna coincidencia, se ejecuta el "else", si no hay parte "else" retorna "null". Finalmente se coloca "end" para indicar que el "case" ha finalizado. Veamos un ejemplo sin parte "else":
 select editorial,
  case count(*)
   when 1 then 1
   end as 'cantidad'
  from libros
  group by editorial;
Extendamos el "case" para mostrar distintos mensajes comparando más de 2 valores:
 select editorial,
  case count(*)
   when 1 then 1
   when 2 then 2
   when 3 then 3
  else 'Más de 3' end as 'cantidad'
  from libros
  group by editorial;
Agregamos la cláusula "order by" para ordenar la salida por la columna "cantidad":
 select editorial,
  case count(*)
   when 1 then 1
   when 2 then 2
   when 3 then 3
  else 'Más de 3' end as 'cantidad'
  from libros
  group by editorial
  order by cantidad;
"case" toma valores puntuales, no expresiones. Intentemos lo siguiente:
 select editorial,
  case count(*)
   when 1 then 1
   when >1 then 'mas de 1'
  end as 'cantidad'
  from libros
  group by editorial;
Usemos la otra sintaxis de "case":
 select editorial,
  case when count(*)=1 then 1
       else 'mas de 1'
  end as 'cantidad'
 from libros
 group by editorial;
PROBLEMA PROPUESTO
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);
 insert into alumnos values(7856,'Gomez Susana',6.4);
 
4- Si el alumno tiene un promedio menor a 4, muestre un mensaje "reprobado", 
si el promedio es mayor o igual a 4 y menor a 7, muestre "regular", si el 
promedio es mayor o igual a 7, muestre "promocionado", usando la primer 
sintaxis de "case":
 
5- Obtenga la misma salida anterior pero empleando la otra sintaxis de "case":
 

Otros problemas:
A) 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- 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 
"case" que muestre la cantidad de horas gratis:

5- 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) y otra 
columna (con "case") que calcule la cantidad de horas cobradas:
 
   
B) En una página web se solicitan los siguientes datos para guardar información
de sus visitas.
 
1- Elimine la tabla "visitas", si existe.
 
2- Créela con la siguiente estructura:
 create table visitas (
  numero int unsigned auto_increment,
  nombre varchar(30) not null,
  mail varchar(50),
  pais varchar (20),
  fecha date,
  primary key(numero)
);
 
3- Ingrese algunos registros:
 insert into visitas (nombre,mail,fecha)
  values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-02-10');
 insert into visitas (nombre,mail,fecha)
  values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-05-10');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-06-11');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
 
4- Muestre el nombre, la fecha de ingreso y los nombres de los días de la 
semana empleando un "case": 
 


5- Muestre el nombre y fecha de ingreso a la página y con un "case" muestre 
si el nombre del mes corresponde al 1º, 2º o 3º cuatrimestre del año.
 
 


 

 



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:
 

59 - Tipos de datos blob y text.


Los tipos "blob" o "text" son bloques de datos. Tienen una longitud de 65535 caracteres.

Un "blob" (Binary Large Object) puede almacenar un volumen variable de datos. La diferencia entre "blob" y "text" es que "text" diferencia mayúsculas y minúsculas y "blob" no; esto es porque "text" almacena cadenas de caracteres no binarias (caracteres), en cambio "blob" contiene cadenas de caracteres binarias (de bytes).

No permiten valores "default".

Existen subtipos:

- tinyblob o tinytext: longitud máxima de 255 caracteres.
- mediumblob o mediumtext: longitud de 16777215 caracteres.
- longblob o longtext: longitud para 4294967295 caracteres.

Se utiliza este tipo de datos cuando se necesita almacenar imágenes, sonidos o textos muy largos.

Un video club almacena la información de sus películas en alquiler en una tabla denominada "peliculas".

Además del título, actor y duración de cada película incluye un campo en el cual guarda la sinopsis de cada una de ellas.

La tabla contiene un campo de tipo "text" llamado "sinopsis":

- codigo: int unsigned auto_increment, clave primaria,
- nombre: varchar(40),
- actor: varchar(30),
- duracion: tinyint unsigned,
- sinopsis: text,

Se ingresan los datos en un campo "text" o "blob" como si fuera de tipo cadena de caracteres, es decir, entre comillas:

 insert into peliculas values(1,'Mentes que brillan','Jodie Foster',120,
 'El no entiende al mundo ni el  mundo lo entiende a él; es un niño superdotado. La escuela 
especial a la que asiste tampoco resuelve los problemas del niño. Su madre hará todo lo que esté a 
su alcance para ayudarlo. Drama');

Para buscar un texto en un campo de este tipo usamos "like":

 select * from peliculas
  where sinopsis like '%Drama%';

No se pueden establecer valores por defecto a los campos de tipo "blob" o "text", es decir, no aceptan la cláusula "default" en la definición del campo.


PROBLEMA RESUELTO

Un video club almacena la información de sus películas en alquiler en una tabla denominada "peliculas".

 Además del título, actor y duración de cada película incluye un campo en el cual guarda la sinopsis de cada una de ellas.

Eliminamos la tabla si existe:

 drop table if exists peliculas;

Creamos la tabla con un campo de tipo "text" llamado "sinopsis":

 create table peliculas(
  codigo int unsigned auto_increment,
  nombre varchar(40),
  actor varchar(30),
  duracion tinyint unsigned,
  sinopsis text,
  primary key (codigo)  
 );

Ingresamos algunos registros:

 insert into peliculas values(1,'Mentes que brillan','Jodie Foster',120,
 'El no entiende al mundo ni el  mundo lo entiende a él, es un niño superdotado. 
  La escuela especial a la que asiste tampoco resuelve los problemas del niño.
  Su madre hará todo lo que esté a su alcance para ayudarlo. Drama');

 insert into peliculas values(2,'Charlie y la fábrica de chocolate','J. Deep',120, 
 'Un niño llamado Charlie tiene la ilusión de encontrar uno de los 5 tickets del 
  concurso para entrar a la fabulosa fábrica de chocolates del excéntrico Willy Wonka 
  y descubrir el misterio de sus golosinas. Aventuras'); 

insert into peliculas values(3,'La terminal','Tom Hanks',180, 'Sin papeles y esperando que el gobierno resuelva su situación migratoria, Victor convierte el aeropuerto de Nueva York en su nuevo hogar trasformando la vida de los empleados del lugar. Drama');


Para buscar todas las películas que en su campo "sinopsis" contengan el texto "Drama" usamos "like": 

 select * from peliculas
  where sinopsis like '%Drama%';

Podemos buscar la película que incluya en su sinopsis el texto "chocolates":

 select * from peliculas
  where sinopsis like '%chocolates%'; 



PROBLEMA PROPUESTO

Una inmobiliaria guarda los datos de sus inmuebles en venta en una tabla llamada "inmuebles".

1- Elimine la tabla si existe:
 
2- Cree la tabla:
 create table inmuebles(
  codigo int unsigned auto_increment,
  domicilio varchar(30),
  barrio varchar(20),
  detalles text,
  primary key(codigo)
 );

3- Ingrsee algunos registros:
 insert into inmuebles values(1,'Colon 123','Centro','patio, 3 dormitorios, garage doble, pileta, 
asador, living, cocina, comedor, escritorio, 2 baños');
 insert into inmuebles values(2,'Caseros 345','Centro','patio, 2 dormitorios, cocina- comedor, 
living');
 insert into inmuebles values(3,'Sucre 346','Alberdi','2 dormitorios, problemas de humedad');
 insert into inmuebles values(4,'Sarmiento 832','Gral. Paz','3 dormitorios, garage, 2 patios');
 insert into inmuebles values(5,'Avellaneda 384','Centro',' 2 patios, 2 dormitorios, garage');

4- Busque todos los inmuebles que tengan "patio":
 


Otros problemas:

 

Una librería guarda la información de sus libros en una tabla llamada "libros".

1- Elimine la tabla si existe:
 
2- Cree la tabla con un campo "blob" en el cual se pueda almacenar los temas principales que trata 
el libro:
 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  autor varchar(30),
  editorial varchar(20),
  temas blob,
  precio decimal(5,2) unsigned,
  primary key(codigo)
 );

3- Ingrese algunos registros.:
 insert into libros values(1,'Aprenda PHP','Mario Molina','Emece',
 'Instalacion de PHP.
  Palabras reservadas.
  Sentencias basicas.
  Definicion de variables.',
 45.6);
 
 insert into libros values(2,'Java en 10 minutos','Mario Molina','Planeta',
 'Instalacion de Java en Windows.
  Instalacion de Java en Linux.
  Palabras reservadas.
  Sentencias basicas.
  Definir variables.',
 55);

 insert into libros values(3,'PHP desde cero','Joaquin Perez','Planeta',
 'Instalacion de PHP.
  Instrucciones basicas.
  Definición de variables.',
 50);

4- Busque todos los libros sobre "PHP" que incluyan el tema "variables":
 
5- Busque los libros de "Java" que incluyan el tema "Instalacion" o "Instalar":
 

58 - Tipo de dato set.


El tipo de dato "set" representa un conjunto de cadenas.

Puede tener 1 ó más valores que se eligen de una lista de valores permitidos que se especifican al definir el campo y se separan con comas. Puede tener un máximo de 64 miembros. Ejemplo: un campo definido como set ('a', 'b') not null, permite los valores 'a', 'b' y 'a,b'. Si carga un valor no incluido en el conjunto "set", se ignora y almacena cadena vacía.

Es similar al tipo "enum" excepto que puede almacenar más de un valor en el campo.

Una empresa necesita personal, varias personas se han presentado para cubrir distintos cargos. La empresa almacena los datos de los postulantes a los puestos en una tabla llamada "postulantes". Le interesa, entre otras cosas, saber los distintos idiomas que conoce cada persona; para ello, crea un campo de tipo "set" en el cual guardará los distintos idiomas que conoce cada postulante.

Para definir un campo de tipo "set" usamos la siguiente sintaxis:

create table postulantes(
 numero int unsigned auto_increment,
 documento char(8),
 nombre varchar(30),
 idioma set('ingles','italiano','portuges'),
 primary key(numero)
);

Ingresamos un registro:

 insert into postulantes (documento,nombre,idioma)
  values('22555444','Ana Acosta','ingles');

Para ingresar un valor que contenga más de un elemento del conjunto, se separan por comas, por ejemplo:

 insert into postulantes (documento,nombre,idioma)
  values('23555444','Juana Pereyra','ingles,italiano');

No importa el orden en el que se inserten, se almacenan en el orden que han sido definidos, por ejemplo, si ingresamos:

 insert into postulantes (documento,nombre,idioma)
  values('23555444','Juana Pereyra','italiano,ingles');

en el campo "idioma" guardará 'ingles,italiano'.

Tampoco importa si se repite algún valor, cada elemento repetido, se ignora y se guarda una vez y en el orden que ha sido definido, por ejemplo, si ingresamos:

 insert into postulantes (documento,nombre,idioma)
  values('23555444','Juana Pereyra','italiano,ingles,italiano');
en el campo "idioma" guardará 'ingles,italiano'.

Si ingresamos un valor que no está en la lista "set", se ignora y se almacena una cadena vacía, por ejemplo:

 insert into postulantes (documento,nombre,idioma) 
  values('22255265','Juana Pereyra','frances');

Si un "set" permite valores nulos, el valor por defecto es "null"; si no permite valores nulos, el valor por defecto es una cadena vacía.

Si se ingresa un valor de índice fuera de rango, coloca una cadena vacía. Por ejemplo:

 insert into postulantes (documento,nombre,idioma)
  values('22255265','Juana Pereyra',0);
 insert into postulantes (documento,nombre,idioma)
  values('22255265','Juana Pereyra',8);

Si se ingresa un valor numérico, lo interpreta como índice de la enumeración y almacena el valor de la lista con dicho número de índice. Los valores de índice se definen en el siguiente orden, en este ejemplo:

1='ingles',
2='italiano',
3='ingles,italiano',
4='portugues',
5='ingles,portugues',
6='italiano,portugues',
7='ingles,italiano,portugues'.

Ingresamos algunos registros con valores de índice:

 insert into postulantes (documento,nombre,idioma)
   values('22255265','Juana Pereyra',2);
 insert into postulantes (documento,nombre,idioma)
  values('22555888','Juana Pereyra',3);

En el campo "idioma", con la primera inserción se almacenará "italiano" que es valor de índice 2 y con la segunda inserción, "ingles,italiano" que es el valor con índice 3.

Para búsquedas de valores en campos "set" se utiliza el operador "like" o la función "find_in_set()".

Para recuperar todos los valores que contengan la cadena "ingles" podemos usar cualquiera de las siguientes sentencias:

 select * from postulantes
  where idioma like '%ingles%';
 select * from postulantes
  where find_in_set('ingles',idioma)>0;

La función "find_in_set()" retorna 0 si el primer argumento (cadena) no se encuentra en el campo set colocado como segundo argumento. Esta función no funciona correctamente si el primer argumento contiene una coma.

Para recuperar todos los valores que incluyan "ingles,italiano" tipeamos:

 select * from postulantes
  where idioma like '%ingles,italiano%';

Para realizar búsquedas, es importante respetar el orden en que se presentaron los valores en la definición del campo; por ejemplo, si se busca el valor "italiano,ingles" en lugar de "ingles,italiano", no retornará registros.

Para buscar registros que contengan sólo el primer miembro del conjunto "set" usamos:

 select * from postulantes
  where idioma='ingles';

También podemos buscar por el número de índice:

 select * from postulantes
  where idioma=1;

Para buscar los registros que contengan el valor "ingles,italiano" podemos utilizar cualquiera de las siguientes sentencias:

 select * from postulantes
  where idioma='ingles,italiano'; 
 select * from postulantes
  where idioma=3;

También podemos usar el operador "not". Para recuperar todos los valores que no contengan la cadena "ingles" podemos usar cualquiera de las siguientes sentencias:

 select * from postulantes
  where idioma not like '%ingles%';
 select * from postulantes
  where not find_in_set('ingles',idioma)>0;

Los tipos "set" admiten cláusula "default".

Los bytes de almacenamiento del tipo "set" depende del número de miembros, se calcula así: (cantidad de miembros+7)/8 bytes; entonces puede ser 1,2,3,4 u 8 bytes.


PROBLEMA RESUELTO


Una empresa necesita personal, varias personas se han presentado para cubrir distintos cargos. La empresa almacena los datos de los postulantes a los puestos en una tabla llamada "postulantes". Le interesa, entre otras cosas, saber los distintos idiomas que conoce cada persona; para ello, crea un campo de tipo "set" en el cual guardará los distintos idiomas que conoce cada postulante.

Eliminamos la tabla, si existe.

Creamos la tabla definiendo un campo de tipo "set" usando la siguiente sintaxis:

 create table postulantes(
  numero int unsigned auto_increment,
  documento char(8),
  nombre varchar(30),
  idioma set('ingles','italiano','portuges'),
  primary key(numero)
 );

Ingresamos un registro:

 insert into postulantes (documento,nombre,idioma)
  values('22555444','Ana Acosta','ingles');

Ingresamos un valor que contiene 2 elementos del conjunto:

 insert into postulantes (documento,nombre,idioma)
  values('23555444','Juana Pereyra','ingles,italiano');

Recuerde que no importa el orden en el que se inserten, se almacenan en el orden que han sido definidos:

 insert into postulantes (documento,nombre,idioma)
  values('25555444','Andrea Garcia','italiano,ingles');

Tampoco importa si se repite algún valor, cada elemento repetido, se ignora y se guarda una vez y en el orden que ha sido definido:

 insert into postulantes (documento,nombre,idioma)
  values('27555444','Diego Morales','italiano,ingles,italiano');

Si ingresamos un valor que no está en la lista "set", se ignora y se almacena una cadena vacía:

 insert into postulantes (documento,nombre,idioma)
  values('27555464','Diana Herrero','frances');

También coloca una cadena vacía si ingresamos valore de índice fuera de rango:

 insert into postulantes (documento,nombre,idioma)
  values('28255265','Pedro Perez',0);
 insert into postulantes (documento,nombre,idioma)
  values('22255260','Nicolas Duarte',8);

Si un "set" permite valores nulos, el valor por defecto el "null":

 insert into postulantes (documento,nombre)
  values('28555464','Ines Figueroa');

Ingresemos un registro con el valor "ingles,italiano,portugues" para el campo "idioma" con su núméro de índice):

 insert into postulantes (documento,nombre,idioma)
  values('29255265','Esteban Juarez',7);

Busquemos valores de campos "set" utilizando el operador "like". Recuperemos todos los valores que contengan la cadena "ingles":

 select * from postulantes
  where idioma like '%ingles%';

Para recuperar todos los valores que incluyen "ingles,italiano", tipeamos:

 select * from postulantes
  where idioma like '%ingles,italiano%';

Recuerde que para las búsquedas, es importante respetar el orden en que se presentaron los valores en la definición del campo; intentemos buscar el valor "italiano,ingles" en lugar de "ingles,italiano", no retornará registros:

 select * from postulantes
  where idioma like '%italiano,ingles%';

Busquemos valores de campos "set" utilizando la función "find_in_set()". Recuperemos todos los postulantes que sepan inglés:

 select * from postulantes
  where find_in_set('ingles',idioma)>0;

Para localizar los registros que sólo contienen el primer miembro del conjunto "set" usamos:

 select * from postulantes
  where idioma='ingles';

También podemos buscar por el número de índice:

 select * from postulantes
  where idioma=1;

Para buscar los registros que contengan el valor "ingles,italiano,portugues" podemos utilizar:

 select * from postulantes
  where idioma=7;

Para recuperar todos los valores que NO contengan la cadena "ingles" podemos usar cualquiera de las siguientes sentencias:

 select * from postulantes
  where idioma not like '%ingles%';
 select * from postulantes
  where not find_in_set('ingles',idioma)>0;


PROBLEMA PROPUESTO

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.

1- Elimine la tabla "cursos", si existe.

2- Cree la tabla "cursos" con la siguiente estructura:
 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 default 1,
  fechainicio date,
  costo decimal(5,2) unsigned,
  primary key(codigo)
 );

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);

4- Una persona quiere inscribirse en un curso de "PHP" y sólo tiene disponibles los sábados. 
Localice los cursos de "PHP" que se dictan solamente los sábados:
 
5- Otra persona quiere aprender a diseñar páginas web, tiene disponibles todas las mañanas excepto 
los miércoles. Vea si existe algún curso que cumpla con sus necesidades:
 
6- Otra persona necesita aprender JavaScript, tiene disponibles todos las tardes excepto los jueves 
y quiere un curso que no supere las 15 clases para el mes de setiembre. Busque algún curso para 
esta persona:
 

Otros problemas:
 
A) Trabaje con la tabla "inmuebles" en la cual una inmobiliaria almacena la información referente a 
sus departamentos en venta.

1- Elimine la tabla "inmuebles" si existe.

2- Cree la tabla "inmuebles":
 create table inmuebles(
  detalles set ('estacionamiento','terraza','pileta','patio','ascensor'),
  domicilio varchar(30),
  propietario varchar(30),
  precio decimal (9,2) unsigned
 );

3- Ingrese algunos registros:
 insert into inmuebles (detalles,precio) 
  values('terraza,pileta',50000);
 insert into inmuebles (detalles,precio) 
  values('patio,terraza,pileta',60000);
 insert into inmuebles (detalles,precio) 
  values('ascensor,terraza,pileta',80000);
 insert into inmuebles (detalles,precio) 
  values('patio,estacionamiento',65000);
 insert into inmuebles (detalles,precio) 
  values('estacionamiento',90000);

4- Seleccione todos los datos de los departamentos con terraza:
 
5- Seleccione los departamentos que no tiene ascensor:
 
6- Muestre los inmuebles que tengan terraza y pileta solamente:
7-Muestre los inmuebles que no tengan ascensor y si estacionamiento, además de otros detalles:
 
8- Ingrese un registro con valor inexistente en "detalles":
 
9 Ingrese un registro sin valor para "detalles":
 

B) Una empresa de turismo vende paquetes de viajes a México y almacena la información referente a 
los mismos en una tabla llamada "viajes":

1- Elimine la tabla si existe.

2- Cree la tabla:
 create table viajes(
  codigo int unsigned auto_increment,
  nombre varchar(50),
  pension enum ('no','media','completa') not null,
  ciudades set ('Acapulco','DF','Cancun','Puerto Vallarta','Cuernavaca') not null,
  dias tinyint unsigned,
  salida date,
  precioporpersona decimal(8,2) unsigned,
  primary key(codigo)
 );

3- Ingrese los siguientes registros:
 insert into viajes (nombre,pension,ciudades,dias,salida)
  values ('Mexico mágico','completa','DF,Acapulco',15,'2005-12-01');
 insert into viajes (nombre,pension,ciudades,dias,salida)
  values ('Mexico especial','media','DF,Acapulco,Cuernavaca',28,'2005-05-10');
 insert into viajes (nombre,pension,ciudades,dias,salida)
  values ('Mexico unico','no','Acapulco,Puerto Vallarta',7,'2005-11-15');
 insert into viajes (nombre,pension,ciudades,dias,salida)
  values ('Mexico DF','no','DF',5,'2005-10-25');
 insert into viajes (nombre,pension,ciudades,dias,salida)
  values ('Mexico caribeño','completa','Cancun',15,'2005-10-25');

4- Ingrese un registro sin valor para el campo "ciudades":
 insert into viajes (nombre,pension,dias,salida)
  values ('Mexico maravilloso','completa',5,'2005-10-25');

5- Seleccione todos los viajes que incluyan "Acapulco":

6- Seleccione todos los viajes que no incluyan "Acapulco" y que incluyan pensión completa:
 
7- Muestre los viajes que incluyan "Puerto Vallarta" o "Cuernavaca":

57 - Tipo de dato enum.


Además de los tipos de datos ya conocidos, existen otros que analizaremos ahora, los tipos "enum" y "set".

El tipo de dato "enum" representa una enumeración. Puede tener un máximo de 65535 valores distintos. Es una cadena cuyo valor se elige de una lista enumerada de valores permitidos que se especifica al definir el campo. Puede ser una cadena vacía, incluso "null".

Los valores presentados como permitidos tienen un valor de índice que comienza en 1.

Una empresa necesita personal, varias personas se han presentado para cubrir distintos cargos. La empresa almacena los datos de los postulantes a los puestos en una tabla llamada "postulantes". Le interesa, entre otras cosas, conocer los estudios que tiene cada persona, si tiene estudios primario, secundario, terciario, universitario o ninguno. Para ello, crea un campo de tipo "enum" con esos valores.

Para definir un campo de tipo "enum" usamos la siguiente sintaxis al crear la tabla:

 create table postulantes(
  numero int unsigned auto_increment,
  documento char(8),
  nombre varchar(30),
  estudios enum('ninguno','primario','secundario', 'terciario','universitario'),
  primary key(numero)
 );

Los valores presentados deben ser cadenas de caracteres.

Si un "enum" permite valores nulos, el valor por defecto el "null"; si no permite valores nulos, el valor por defecto es el primer valor de la lista de permitidos.

Si se ingresa un valor numérico, lo interpreta como índice de la enumeración y almacena el valor de la lista con dicho número de índice. Por ejemplo:

 insert into postulantes (documento,nombre,estudios)
 values('22255265','Juana Pereyra',5);

En el campo "estudios" almacenará "universitario" que es valor de índice 5.

Si se ingresa un valor inválido, puede ser un valor no presente en la lista o un valor de índice fuera de rango, coloca una cadena vacía. Por ejemplo:

 insert into postulantes (documento,nombre,estudios)
  values('22255265','Juana Pereyra',0);
 insert into postulantes (documento,nombre,estudios)
  values('22255265','Juana Pereyra',6);
 insert into postulantes (documento,nombre,estudios)
  values('22255265','Juana Pereyra','PostGrado');

En los 3 casos guarda una cadena vacía, en los 2 primeros porque los índices ingresados están fuera de rango y en el tercero porque el valor no está incluido en la lista de permitidos.

Esta cadena vacía de error, se diferencia de una cadena vacía permitida porque la primera tiene el valor de índice 0; entonces, podemos seleccionar los registros con valores inválidos en el campo de tipo "enum" así:

 select * from postulantes
  where estudios=0;

El índice de un valor "null" es "null".

Para seleccionar registros con un valor específico de un campo enumerado usamos "where", por ejemplo, queremos todos los postulantes con estudios universitarios:

 select * from postulantes
  where estudios='universitario';

Los tipos "enum" aceptan cláusula "default".

Si el campo está definido como "not null" e intenta almacenar el valor "null" aparece un mensaje de error y la sentencia no se ejecuta.

Los bytes de almacenamiento del tipo "enum" depende del número de valores enumerados.


PROBLEMA RESUELTO

Una empresa necesita personal, varias personas se han presentado para cubrir distintos cargos.

La empresa almacena los datos de los postulantes a los puestos en una tabla llamada "postulantes". Le interesa, entre otras cosas, conocer los estudios que tiene cada persona, si tiene estudios primario, secundario, terciario, universitario o ninguno. Para ello, crea un campo de tipo "enum" con esos valores.
Eliminamos la tabla "postulantes", si existe.

Creamos la siguiente tabla definiendo un campo de tipo "enum":

 create table postulantes(
  numero int unsigned auto_increment,
  documento char(8),
  nombre varchar(30),
  sexo char(1),
  estudios enum('ninguno','primario','secundario', 'terciario','universitario') not null,
  primary key(numero)
 );

Ingresamos algunos registros:

 insert into postulantes (documento,nombre,sexo,estudios)
  values('22333444','Ana Acosta','f','primario');
 insert into postulantes (documento,nombre,sexo,estudios)
  values('22433444','Mariana Mercado','m','universitario');

Ingresamos un registro sin especificar valor para "estudios", guardará el valor por defecto:

 insert into postulantes (documento,nombre,sexo)
  values('24333444','Luis Lopez','m');

Vemos el registro ingresado:

select * from postulantes;

En el campo "estudios" se guardó el valor por defecto, el primer valor de la lista enumerada.

Si ingresamos un valor numérico, lo interpreta como índice de la enumeración y almacena el valor de la lista con dicho número de índice. Por ejemplo:

 insert into postulantes (documento,nombre,sexo,estudios)
   values('2455566','Juana Pereyra','f',5);

En el campo "estudios" almacenará "universitario" que es valor de índice 5.

Si ingresamos un valor no presente en la lista, coloca una cadena vacía. Por ejemplo:

 insert into postulantes (documento,nombre,sexo,estudios)
  values('24678907','Pedro Perez','m','Post Grado');

Si ingresamos un valor de índice fuera de rango, almacena una cadena vacía:

 insert into postulantes (documento,nombre,sexo,estudios)
   values('22222333','Susana Pereyra','f',6);
 insert into postulantes (documento,nombre,sexo,estudios)
  values('25676567','Marisa Molina','f',0);

La cadena vacía ingresada como resultado de ingresar un valor incorrecto tiene el valor de índice 0; entonces, podemos seleccionar los registros con valores inválidos en el campo de tipo "enum" así:

 select * from postulantes
  where estudios=0;

Queremos seleccionar los postulantes con estudios universitarios:

 select * from postulantes
  where estudios='universitario';

Como el campo está definido como "not null", si intentamos almacenar el valor "null" aparece un mensaje de error y la sentencia no se ejecuta.

 insert into postulantes (documento,nombre,sexo,estudios)
  values('25676567','Marisa Molina','f',null);


PROBLEMA PROPUESTO


Trabajamos con la tabla "empleados" de una empresa.

1- Elimine la tabla empleados, si existe.

2- Cree la tabla con la siguiente estructura:
 create table empleados(
  documento char(8),
  nombre varchar(30),
  sexo char(1),
  estadocivil enum('soltero','casado','divorciado','viudo') not null,
  sueldobasico decimal(6,2),
  primary key(documento)
);

3- Ingrese algunos registros:
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('22333444','Juan Lopez','m','soltero',300);
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('23333444','Ana Acosta','f','viudo',400);

4- Intente ingresar un valor "null" para el campo enumerado:
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('25333444','Ana Acosta','f',null,400);

5- Ingrese resgistros con valores de índice para el campo "estadocivil":
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('26333444','Luis Perez','m',1,400);
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('26336444','Marcelo Torres','m',3,460);

6- Ingrese un valor inválido, uno no presente en la lista y un valor de índice fuera de rango 
(guarda una cadena vacía):
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('29333444','Lucas Perez','m',0,400);
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('30336444','Federico Garcia','m',5,450);
 insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
  values ('31333444','Karina Sosa','f','Concubino',500);

7- Seleccione todos los empleados solteros:
 
8- Seleccione todos los empleados viudos usando el número de índice de la enumeración:
 


Otros problemas:

 

A) Una empresa de turismo vende paquetes de viajes y almacena la información referente a los mismos 
en una tabla llamada "viajes":

1- Elimine la tabla si existe.

2- Cree la tabla:
 create table viajes(
  codigo int unsigned auto_increment,
  nombre varchar(50),
  pension enum ('no','media','completa') not null,
  hotel enum ('1','2','3','4','5'),/* cantidad de estrellas*/
  dias tinyint unsigned,
  salida date,
  precioporpersona decimal(8,2) unsigned,
  primary key(codigo)
 );

4- Ingrese algunos registros:
 insert into viajes (nombre,pension,hotel,dias,salida)
  values ('Mexico mágico','completa','4',15,'2005-12-01');
 insert into viajes (nombre,pension,hotel,dias,salida)
  values ('Europa fantastica','media','5',28,'2005-05-10');
 insert into viajes (nombre,pension,hotel,dias,salida)
  values ('Caribe especial','no','3',7,'2005-11-25');

5- Intente ingresar un valor "null" para el campo "pension":
 insert into viajes (nombre,pension,hotel,dias,salida)
  values ('Mexico maravilloso',null,'4',15,'2005-12-01');

6- Ingrese valor nulo para el campo "hotel"
 insert into viajes (nombre,pension,hotel,dias,salida)
  values ('Mexico especial','media',3,18,'2005-11-01');

7- Ingrese un valor inválido, no presente en la lista de "pension" (guarda una cadena vacía):
 insert into viajes (nombre,pension,hotel,dias,salida)
  values ('Caribe especial','ninguna','4',18,'2005-11-01');

8- Ingrese un valor de índice fuera de rango para el campo "hotel":
 insert into viajes (nombre,pension,hotel,dias,salida)
  values ('Venezuela única','no',6,18,'2005-11-01');

9- Seleccione todos los viajes que incluyen media pensión:
 
10- Seleccione todos los viajes que incluyen un hotel de 4 estrellas:
 

B) Una inmobiliaria vende inmuebles; los inmuebles pueden ser: casa, departamento, local o terreno.

1- Elimine la tabla "inmuebles" si existe.

2- Cree la tabla "inmuebles" para registrar la siguiente información:
 - tipo de inmueble: tipo enum (casa,dpto,local,terreno), not null,
 - domicilio: varchar(30),
 - propietario: nombre del dueño,
 - precio: decimal hasta $999999.99 positivo.

3- Ingrese algunos registros.

4- Seleccione el domicilio y precio de todos los departamentos en alquiler.

5- Seleccione el domicilio, propietario y precio de todos los locales en venta.

6- Seleccione el domicilio y precio de todas las casas disponibles.

56 - renombrar tablas (alter table - rename - rename table)


Podemos cambiar el nombre de una tabla con "alter table".

Para cambiar el nombre de una tabla llamada "amigos" por "contactos" usamos esta sintaxis:

 alter table amigos rename contactos;

Entonces usamos "alter table" seguido del nombre actual, "rename" y el nuevo nombre.

También podemos cambiar el nombre a una tabla usando la siguiente sintaxis:

 rename table amigos to contactos;

La renombración se hace de izquierda a derecha, con lo cual, si queremos intercambiar los nombres de dos tablas, debemos tipear lo siguiente:

 rename table amigos to auxiliar,
  contactos to amigos,
  auxiliar to contactos;

PROBLEMA RESUELTO

Eliminamos las tablas "amigos" y "contactos" si existen.

Creamos la tabla "amigos" con la siguiente estructura:

 create table amigos(
  nombre varchar(30),
  domicilio varchar(30),
  telefono varchar (11)
 );

Para cambiar el nombre de nuestra tabla "amigos" por "contactos" usamos esta sintaxis:

 alter table amigos rename contactos;

Veamos si existen las tablas "amigos" y "contactos":

 show tables;

La tabla "amigos" ya no existe, si "contactos".

También podemos cambiar el nombre a una tabla usando la siguiente sintaxis:

 rename table contactos to amigos;

Así cambiamos el nombre de la tabla "contactos" por "amigos".

Veamos si existen las tablas "amigos" y "contactos":

 show tables;

La tabla "contactos" ya no existe, si "amigos".

Podemos intercambiar los nombres de dos tablas. Por ejemplo, tenemos una tabla llamada "amigos" con los datos de nuestros amigos y otra tabla "contactos" con los datos de compañeros de trabajo, ambas con la misma estructura.

Elimine las tablas "amigos" y "contactos" si existen.

Créelas:

 create table amigos(
  nombre varchar(30),
  domicilio varchar(30),
  telefono varchar (11)
 );
 create table contactos(
  nombre varchar(30),
  domicilio varchar(30),
  telefono varchar (11)
 );

Ingresemos algunos registros:

 insert into contactos (nombre,telefono)
  values('Juancito','4565657'); 
 insert into contactos (nombre,telefono)
  values('patricia','4223344'); 

 insert into amigos (nombre,telefono)
  values('Perez Luis','4565657'); 
 insert into amigos (nombre,telefono)
  values('Lopez','4223344'); 

Para intercambiar los nombres de estas dos tablas, debemos tipear lo siguiente:

 rename table amigos to auxiliar,
  contactos to amigos,
  auxiliar to contactos;

Verifiquemos el cambio de nombre:

 select * from amigos;
 select * from contactos;


PROBLEMA PROPUESTO

Trabajamos con la tabla "peliculas" de un video club.

1- Elimine la tabla, si existe.

2- Cree la tabla "peliculas":
 create table peliculas(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  duracion tinyint unsigned
 );

3- Cambie el nombre de la tabla por "films" con "alter table":
 
4- Vea si existen las tablas "peliculas" y "films":
 
5- Cambie nuevamente el nombre, de la tabla "films" por "peliculas" usando "rename":

6- vea si existen las tablas:
 


Otros problemas:

 

Una empresa tiene almacenados los datos de sus clientes en una tabla llamada "clientes" y los datos 
de sus empleados en otra tabla denominada "empleados".

1- Elimine ambas tablas si existen.

2- Cree las tablas dándoles el nombre equivocado, es decir, de el nombre "clientes" a la tabla que 
contiene los datos de los empleados y el nombre "empleados" a la tabla con la informaciómn de los 
clientes:
 create table clientes(
  documento char(8) not null,
  nombre varchar(30),
  domicilio varchar(30),
  fechaingreso date,
  sueldo decimal(6,2) unsigned
 );

 create table empleados(
  documento char(8) not null,
  nombre varchar(30),
  domicilio varchar(30),
  ciudad varchar(30),
  provincia varchar(30)
 );

3- Vea la estructura de ambas tablas:
 
4- Intercambie los nombres de las dos tablas:
 
5- Verifique el cambio de nombre:
 
6- Vea si existe la tabla "auxiliar":
  

martes, 6 de noviembre de 2012

55 - Borrado de índices (alter table - drop index)



Los índices común y únicos se eliminan con "alter table".

Trabajamos con la tabla "libros" de una librería, que tiene los siguientes campos e índices:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key(codigo),
  index i_editorial (editorial),
  unique i_tituloeditorial (titulo,editorial)
 );

Para eliminar un índice usamos la siguiente sintaxis:

 alter table libros
  drop index i_editorial;

Usamos "alter table" y "drop index" seguido del nombre del índice a 
borrar.

Para eliminar un índice único usamos la misma sintaxis:

 alter table libros
  drop index i_tituloeditorial;



PROBLEMA RESUELTO


Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla "libros" si existe.
Creamos la tabla "libros", con los siguientes campos e índices:
 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key(codigo),
  index i_editorial (editorial),
  unique i_tituloeditorial (titulo,editorial)
 );
Para eliminar el índice común llamado "i_editorial" usamos la siguiente sintaxis:
 alter table libros
  drop index i_editorial;
Para eliminar el índice único llamado "i_tituloeditorial" usamos la misma sintaxis:
 alter table libros
  drop index i_tituloeditorial;
Visualicemos los índices de la tabla:
 show index from libros;
vemos que solamente queda el índice "PRIMARY", este índice no se puede eliminar; se elimina automáticamente al eliminar la clave primaria.
PROBLEMA PROPUESTO

Trabajamos con la tabla "alumnos" en la cual un instituto de enseñanza guarda 
los datos de sus alumnos.

1- Elimine la tabla "alumnos" si existe.

2- Cree la tabla con los siguientes índices:
 create table alumnos(
  año year not null,
  numero int unsigned not null,
  nombre varchar(30),
  documento char(8) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar(20),  
  primary key(año,numero),
  unique i_documento (documento),
  index i_ciudadprovincia (ciudad,provincia),
 );

3- Vea los índices de la tabla.

4- Elimine el índice único:
 
5- Elimine el índice común:
 
6- Vea los índices:
 

Otros problemas: 

Una clínica registra las consultas de los pacientes en una tabla llamada 
"consultas".

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura:
create table consultas(
  fecha date,
  numero int unsigned,
  documento char(8) not null,
  obrasocial varchar(30),
  medico varchar(30),
  primary key(fecha,numero),
  unique i_consulta(documento,fecha,medico),
  index i_medico (medico),
  index i_obrasocial (obrasocial)
 );

3- Vea los índices de la tabla.

4- Elimine el índice único:
 
5- Elimine los índices comumes:
 
6- Vea los índices: