55 - Vistas

Una vista es como una tabla virtual que almacena una consulta.

Entonces, una vista almacena una consulta como un objeto para utilizarse posteriormente. Las tablas consultadas en una vista se llaman tablas base. En general, se puede dar un nombre a cualquier consulta y almacenarla como una vista.

Una vista suele llamarse también tabla virtual porque los resultados que retorna y la manera de referenciarlas es la misma que para una tabla.

Las vistas permiten:

- ocultar información: permitiendo el acceso a algunos datos y manteniendo oculto el resto de la información que no se incluye en la vista.

- mejorar el rendimiento: se puede evitar tipear instrucciones repetidamente almacenando en una vista el resultado de una consulta compleja que incluya información de varias tablas.

Una vista en SQLite es de solo lectura. Significa que no puede usar la instrucción INSERT, DELETE y UPDATE para actualizar los datos.

Podemos crear vistas con: un subconjunto de registros y campos de una tabla; una unión de varias tablas; una combinación de varias tablas; un resumen estadístico de una tabla; un subconjunto de otra vista, combinación de vistas y tablas.

Una vista se define usando un "select".

La sintaxis básica parcial para crear una vista es la siguiente:

 create view NOMBREVISTA as
  SENTENCIAS SELECT
   from TABLA;

El contenido de una vista se muestra con un "select":

 select * from NOMBREVISTA;

Problema resuelto

Una empresa almacena la información de sus empleados en dos tablas llamadas "empleados" y "secciones".

Eliminaremos las dos tablas si ya existen:

 drop table if exists secciones;
 drop table if exists empleados;

Creamos las dos tablas con las siguientes estructuras:

 create table secciones(
  codigo integer primary key,
  nombre text,
  sueldo real
 );

 create table empleados(
  legajo integer primary key,
  documento text,
  sexo text,
  apellido text,
  nombre text,
  domicilio text,
  seccion integer,
  cantidadhijos integer,
  estadocivil text
 );

Almacenamos una serie de filas en cada tabla:

 insert into secciones(nombre,sueldo) values('Administracion',300);
 insert into secciones(nombre,sueldo) values('Contaduría',400);
 insert into secciones(nombre,sueldo) values('Sistemas',500);

 insert into empleados
(documento,sexo,apellido,nombre,domicilio,seccion,cantidadhijos,estadocivil)
 values('22222222','f','Lopez','Ana','Colon 123',1,2,'casado');
 insert into empleados
(documento,sexo,apellido,nombre,domicilio,seccion,cantidadhijos,estadocivil)
 values('23333333','m','Lopez','Luis','Sucre 235',1,0,'soltero');
 insert into empleados
(documento,sexo,apellido,nombre,domicilio,seccion,cantidadhijos,estadocivil) 
values('24444444','m','Garcia','Marcos','Sarmiento 1234',2,3,'divorciado');
 insert into empleados
(documento,sexo,apellido,nombre,domicilio,seccion,cantidadhijos,estadocivil) 
values('25555555','m','Gomez','Pablo','Bulnes 321',3,2,'casado');
 insert into empleados
(documento,sexo,apellido,nombre,domicilio,seccion,cantidadhijos,estadocivil) 
values('26666666','f','Perez','Laura','Peru 1254',3,3,'casado'); 

Eliminamos la vista "vista_empleados" si ya existe:

 drop view if exists vista_empleados;

Este proceso de borrar la vista la hacemos ya que si intentamos crear una nueva vista con el mismo nombre se produce un error.

Creamos la vista "vista_empleados":

 create view vista_empleados as
  select (apellido||' '||e.nombre) as nombre,sexo,
   s.nombre as seccion, cantidadhijos
   from empleados as e
   join secciones as s
   on codigo=seccion;

Vemos la información de la vista:

select * from vista_empleados;   

Realizamos una consulta a la vista como si se tratara de una tabla:

select seccion,count(*) as cantidad
  from vista_empleados
  group by seccion;

Insertamos una nueva fila en la tabla "empleados":

 insert into empleados
(documento,sexo,apellido,nombre,domicilio,seccion,cantidadhijos,estadocivil) 
values('27777777','f','Rodriguez','Pablo','Colon 33',3,3,'casado'); 

Si mostramos nuevamente la vista aparece el nuevo empleado ingresado:

select * from vista_empleados;   

Problema propuesto

Un club dicta cursos de distintos deportes. Almacena la información en varias tablas.
El director no quiere que los empleados de administración conozcan la estructura de las tablas ni algunos datos de los profesores y socios, por ello se crean vistas a las cuales tendrán acceso.

  1. Borrar las 4 tablas si ya existen:

     drop table if exists socios;
     drop table if exists profesores;
     drop table if exists cursos;
     drop table if exists inscriptos;
    
  2. Creamos las 4 tablas con las siguientes estructuras:

     create table socios(
      documento text primary key,
      nombre text,
      domicilio text
     );
    
     create table profesores(
      documento text primary key,
      nombre text,
      domicilio text
     );
    
     create table cursos(
      numero integer primary key,
      deporte text,
      dia text,
      documentoprofesor text
     );
     
     create table inscriptos(
      documentosocio text,
      numero integer,
      matricula text,
      primary key (documentosocio,numero)
     ); 
    
  3. Insertamos una serie de filas con datos de prueba:

     insert into socios values('30000000','Fabian Fuentes','Caseros 987');
     insert into socios values('31111111','Gaston Garcia','Guemes 65');
     insert into socios values('32222222','Hector Huerta','Sucre 534');
     insert into socios values('33333333','Ines Irala','Bulnes 345');
    
     insert into profesores values('22222222','Ana Acosta','Avellaneda 231');
     insert into profesores values('23333333','Carlos Caseres','Colon 245');
     insert into profesores values('24444444','Daniel Duarte','Sarmiento 987');
     insert into profesores values('25555555','Esteban Lopez','Sucre 1204');
    
     insert into cursos(deporte,dia,documentoprofesor) values('tenis','lunes','22222222');
     insert into cursos(deporte,dia,documentoprofesor) values('tenis','martes','22222222');
     insert into cursos(deporte,dia,documentoprofesor) values('natacion','miercoles','22222222');
     insert into cursos(deporte,dia,documentoprofesor) values('natacion','jueves','23333333');
     insert into cursos(deporte,dia,documentoprofesor) values('natacion','viernes','23333333');
     insert into cursos(deporte,dia,documentoprofesor) values('futbol','sabado','24444444');
     insert into cursos(deporte,dia,documentoprofesor) values('futbol','lunes','24444444');
     insert into cursos(deporte,dia,documentoprofesor) values('basquet','martes','24444444');
    
     insert into inscriptos values('30000000',1,'s');
     insert into inscriptos values('30000000',3,'n');
     insert into inscriptos values('30000000',6,'s');
     insert into inscriptos values('31111111',1,'s');
     insert into inscriptos values('31111111',4,'s');
     insert into inscriptos values('32222222',8,'s');
    
  4. Cree una vista en la que aparezca el nombre y documento del socio, el deporte, el día y el nombre del profesor (primero borrar la vista si ya existe)

  5. Muestre la información contenida en la vista creada en el punto anterior.

  6. Realice una consulta a la vista donde muestre la cantidad de socios inscriptos en cada deporte ordenados por cantidad.

  7. Muestre todos los socios que son compañeros en tenis los lunes.

Solución
 drop table if exists socios;
 drop table if exists profesores;
 drop table if exists cursos;
 drop table if exists inscriptos;
 
 create table socios(
  documento text primary key,
  nombre text,
  domicilio text
 );

 create table profesores(
  documento text primary key,
  nombre text,
  domicilio text
 );

 create table cursos(
  numero integer primary key,
  deporte text,
  dia text,
  documentoprofesor text
 );
 
 create table inscriptos(
  documentosocio text,
  numero integer,
  matricula text,
  primary key (documentosocio,numero)
 ); 
 
 insert into socios values('30000000','Fabian Fuentes','Caseros 987');
 insert into socios values('31111111','Gaston Garcia','Guemes 65');
 insert into socios values('32222222','Hector Huerta','Sucre 534');
 insert into socios values('33333333','Ines Irala','Bulnes 345');

 insert into profesores values('22222222','Ana Acosta','Avellaneda 231');
 insert into profesores values('23333333','Carlos Caseres','Colon 245');
 insert into profesores values('24444444','Daniel Duarte','Sarmiento 987');
 insert into profesores values('25555555','Esteban Lopez','Sucre 1204');

 insert into cursos(deporte,dia,documentoprofesor) values('tenis','lunes','22222222');
 insert into cursos(deporte,dia,documentoprofesor) values('tenis','martes','22222222');
 insert into cursos(deporte,dia,documentoprofesor) values('natacion','miercoles','22222222');
 insert into cursos(deporte,dia,documentoprofesor) values('natacion','jueves','23333333');
 insert into cursos(deporte,dia,documentoprofesor) values('natacion','viernes','23333333');
 insert into cursos(deporte,dia,documentoprofesor) values('futbol','sabado','24444444');
 insert into cursos(deporte,dia,documentoprofesor) values('futbol','lunes','24444444');
 insert into cursos(deporte,dia,documentoprofesor) values('basquet','martes','24444444');

 insert into inscriptos values('30000000',1,'s');
 insert into inscriptos values('30000000',3,'n');
 insert into inscriptos values('30000000',6,'s');
 insert into inscriptos values('31111111',1,'s');
 insert into inscriptos values('31111111',4,'s');
 insert into inscriptos values('32222222',8,'s'); 
 
 drop view if exists vista_club;
 
 create view vista_club as
  select s.nombre as socio,s.documento as docsocio,s.domicilio as domsocio,c.deporte,dia,
   p.nombre as profesor, matricula
   from socios as s
   join inscriptos as i
   on s.documento=i.documentosocio
   join cursos as c
   on i.numero=c.numero
   join profesores as p
   on c.documentoprofesor=p.documento;
 
 select * from vista_club;
 

 select deporte,dia,count(socio) as cantidad
  from vista_club
  where deporte is not null
  group by deporte,dia
  order by cantidad; 
  
 select socio from vista_club
  where deporte='tenis' and dia='lunes';

Ejecución de ejercicios online

Puede ejecutar comandos de SQLite directamente en el sitio sin tener que instalar nada en su computadora.

Resultado.....