2.7. Vistas

Una vista es una tabla virtual cuyo contenido está definido por una consulta.

Una vista es sencillamente un objeto de base de datos que presenta datos de tablas. Se trata de una consulta SQL que está permanentemente almacenada en la Base de datos y a la que se le asigna un nombre, de modo que los resultados de la consulta almacenada son visibles a través de la vista, y SQL permite acceder a estos resultados como si fueran de hecho una tabla real en la base de datos.

Las tablas y las vistas comparten el mismo espacio de nombres en la base de datos, por lo tanto, una base de datos no puede contener una tabla y una vista con el mismo nombre.

Las vistas suelen utilizarse para centrar, simplificar y personalizar la percepción de la base de datos para cada usuario. Las vistas pueden emplearse como mecanismos de seguridad, que permiten a los usuarios obtener acceso a los datos por medio de la vista, pero no les conceden el permiso de obtener acceso directo a las tablas subyacentes de la vista. Las vistas se pueden utilizar para realizar particiones de datos y para mejorar el rendimiendo cuando se copian, se importan y se exportan datos.

Mediante vistas es posible presentar datos de distintos servidores. Por ejemplo, para combinar datos de distintos servidores remotos o en un servidor de multiples procesadores, cada uno de los cuales almacenan datos para una región distinta de su organización, puede crear consultas distribuidas o paralelas aumentando la eficiencia de las consultas.

Mediante diversas cláusulas es factible crear, modificadar, eliminar y administrar vistas. La sintaxis básica para estas cláusulas es generica entre diversos gestores de base de datos. Sin embargo en lo particular cada gestor implementa la administración de estas de forma diferente. En este documentos se presenta la sintaxis particular de Oracle 11g

La sintaxis básica de una vista (Oracle):

CREATE VIEW nombre_vista AS consulta;

Sintaxis CREATE VIEW

CREATE [OR REPLACE] 
  VIEW nombre_vista AS sentencia_select
  [WITH [CASCADED | LOCAL] CHECK OPTION] 
   WITH READ ONLY

Ejemplo: Municipios del estado de Veracruz, México

CREATE OR REPLACE VIEW veracruz AS
SELECT M.idMunicipio, M.idEstado, M.municipio
FROM municipios M, estados E
WHERE (E.idEstado = M.idEstado) AND (E.estado = 'Veracruz')

Ejemplo: En el futbol se conoce como Caballo de Hierro a los deportistas que jugaron los 90 minutos en todos los partidos de un campeonato. El siguiente DER describe el diseño general de este problema

Y Considerando que en el torneo Mexicano de Futbol BBV Bancomer se disputa en 17 fechas en la fase regular. La vista que define a estos futbolistas es la siguiente.

CREATE OR REPLACE VIEW caballoDeHierro AS
SELECT E.nombreEquipo, J.nombre 
FROM equipo E, jugadores J
WHERE E.idEquipo = J.idEquipo   
  AND J.JC = 17
  ORDER BY E.nombreEquipo, J.nombre;

Ahora solo tenemos que hacer una consulta para obtener la vista correspondiente.

SELECT * FROM caballoDeHierro;

Modificar una vista

Ejemplo.El cual modificara la vista caballo de hierro con los jugadores que recibieron 3 amonestaciones o menos, y su posición.

CREATE OR REPLACE VIEW caballoDeHierro AS
SELECT P.nombrePosicion, E.nombreEquipo equipo,
       J.nombre, J.JJ, J.TA 
FROM equipo E, jugador J, posicion P
WHERE E.idEquipo = J.idEquipo
AND P.idPosicion = J.idPosicion
AND J.JC = 17 AND (J.ta <= 3 )
ORDER BY E.nombreEquipo, J.nombre;
SELECT * FROM caballoDeHierro;

Eliminar vistas

La sintaxis para eliminar una vista es:

DROP VIEW nombreVista
   [ CASCADE CONSTRAINTS ];

Eliminamos la vista denominada 'caballoDeHierro':

DROP VIEW caballoDeHierro;

Actualización de vistas

Algunas vistas pueden actualizarse mediante sentencias INSERT, DELETE o UPDATE sobre ellas, considerando las siguientes reglas:

Ejemplo: Población por entidad federativa 2010 INEGI (INSTITUTO NACIONAL DE ESTADISTICA, GEOGRAFIA E INFORMATICA). El ejemplo siguiente crea una vista que usa la cláusula CHECK OPTION donde seleccionan aquellas entidades federativas que tienen menos de 2 millones de habitantes.

CREATE TABLE entidad (
  estado     CHAR(30) NOT NULL,
  poblacion  NUMBER   NOT NULL
);

INSERT INTO entidad values ('Estado de México',  15175862);
INSERT INTO entidad values ('Distrito Federal',   8851080);
INSERT INTO entidad values ('Veracruz',           7643194);
INSERT INTO entidad values ('Jalisco',            7350682);
INSERT INTO entidad values ('Puebla',             5779829);
INSERT INTO entidad values ('Guanajuato',         5486372);
INSERT INTO entidad values ('Chiapas',            4796580);
INSERT INTO entidad values ('Nuevo León',         4653458);
INSERT INTO entidad values ('Michoacán de Ocampo',4351037);
INSERT INTO entidad values ('Oaxaca',             3801962);
INSERT INTO entidad values ('Chihuahua',          3406465);
INSERT INTO entidad values ('Guerrero',           3388768);

CREATE OR REPLACE VIEW entidades AS
SELECT * FROM entidad
WHERE poblacion < 2000000
WITH CHECK OPTION;

Ahora considere la siguiente información. Para insertarla en la vista recien creada.

Entidad Población
Tamaulipas 3,268,554
Baja California 3,155,070
Sinaloa 2,767,761
Coahuila de Zaragoza 2,748,391
Hidalgo 2,665,018
Sonora 2,662,480
San Luis Potosí 2,585,518
Tabasco 2,238,603
Yucatán 1,955,577
Querétaro 1,827,937
Morelos 1,777,227
Durango 1,632,934
Zacatecas 1,490,668
Quintana Roo 1,325,578
Aguascalientes 1,213,445
Tlaxcala 1,169,936
Nayarit 1,084,979
Campeche 822,441
Colima 650,555
Baja California Sur 637,026

Claúsula WITH CHECK OPTTION

Asegura que un comando DML sobre la vista mantiene el dominio de la misma.

CREATE OR REPLACE VIEW veracruz AS
SELECT M.idMunicipio, M.idEstado, M.municipio
FROM municipios M, estados E
WHERE (E.idEstado = M.idEstado) AND (E.estado = 'Veracruz')
WITH CHECK OPTION

De esta vista usted no puede modificar el campo idEstado, porque al hacerlo ya no aparecería en la vista. El resto de los campos de la vista son actualizables

Si usas el comando INSERT solo sería válido si el valor del campo idEstado fuera 30. O sea el correspondiente al estado de Veracruz

Con la cláusula CHECK OPTION cada vez que se trata de hacer una violación de la condición dentro del WHERE obtendremos un error ORA-01402

Claúsula WITH READ ONLY

Agregando la opción WITH READ ONLY en la definición de la vista, se asegura que no ocurran operaciones DML.

CREATE OR REPLACE VIEW veracruz AS
SELECT M.idMunicipio, M.idEstado, M.municipio
FROM municipios M, estados E
WHERE (E.idEstado = M.idEstado) AND (E.estado = 'Veracruz')
WITH READ ONLY

Si se intenta realizar una operación DML sobre cualquier fila en la vista, aparecerá el error ORA-01732