Listado completo de tutoriales

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 (versiones nuevas de MySQL no se inserta la fila), 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 (versiones nuevas de MySQL debe indicarse en la creación el valor default).

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.

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

drop table if exists postulantes;

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

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

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

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

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

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

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

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

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

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

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

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

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

select * from postulantes
  where idioma='ingles';

select * from postulantes
  where idioma=1;

select * from postulantes
  where idioma=7;

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

Genera una salida similar a esta:

MySQL set

Retornar