58 - Tipo de dato set.


Problema:

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;



Retornar