jueves, 8 de noviembre de 2012

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.

No hay comentarios:

Publicar un comentario