Vistas, VIEW

Las aplicaciones bien diseñadas suelen ofrecer una interfaz pública y ocultar los detalles de implementación, lo que permite cambiar el diseño sin afectar a los usuarios finales.

Al diseñar tu base de datos puedes conseguir un resultado parecido: cierras el acceso a las tablas y das acceso a los datos solo a través de un conjunto de vistas.

En este artículo veremos qué son las vistas, cómo se crean y para qué pueden ser útiles.

Qué es una vista

A las vistas a veces se las llama «tablas virtuales». Esto se debe a que, para el usuario, una vista parece una tabla, pero en realidad no almacena datos, sino que los extrae de otras tablas en el momento del acceso.

Si los datos de la tabla base cambian, el usuario obtiene los datos actualizados al acceder a la vista que usa esa tabla. Además, las vistas no guardan en caché los resultados que obtienen de las tablas.

Ejemplo de creación de una vista

Como ejemplo sencillo, supongamos que quieres ocultar parcialmente las direcciones de correo electrónico de la tabla de usuarios (Users).

Esto puede ser útil, por ejemplo, si la política de tu empresa no permite que todo el mundo use la información confidencial de los usuarios. Así que, en lugar de permitir el acceso directo a la tabla de usuarios (Users), defines una vista llamada ViewUsers y exiges que todos la usen para acceder a los datos de los usuarios.

Este es un ejemplo de definición de esa vista:

MySQL 8.4
CREATE VIEW ViewUsers AS
    SELECT id,
           name,
           CONCAT(SUBSTR(email, 1, 2), '****', SUBSTR(email, -4)) AS email
FROM Users;

Este es un ejemplo de definición de esa vista:

MySQL 8.4
CREATE VIEW ViewUsers AS
    SELECT id,
           name,
           CONCAT(SUBSTR(email, 1, 2), '****', RIGHT(email, 4)) AS email
FROM Users;

En una consulta SQL, una vista tiene el mismo aspecto y se usa igual que una tabla normal:

MySQL 8.4
SELECT * FROM ViewUsers;
idnameemail
1Bruce Willisba****.com
2George Clooneyte****.com
3Kevin Costnerme****.com
4Donald Sutherlandra****.net
5Jennifer Lopezba****.com
6Ray Liottajd****.net
7Samuel L. Jacksonmo****.com
8Nikole Kidmanok****.com
9Alan Rickmanka****.net
10Kurt Russellga****.com
11Harrison Fordko****.com
12Russell Crowegl****.net
13Steve Martinne****.com
14Michael Cainedm****.com
15Angelina Joliech****.net
16Mel Gibsonro****o.ca
17Michael Douglasti****.com
18John Travoltawa****.com
19Sylvester Stalloneko****.com
20Tommy Lee Jonessz****.com
21Catherine Zeta-Jonesfl****.com
22Antonio Banderassa****.net
23Kim Basingerja****.net
24Sam Neillcl****.com
25Hideo Kojimaad****.org
26ClINT Eastwoodfr****.net
27Brad Pittke****.net
28Johnny Deppcg****o.ca
29Pierce Brosnantr****.com
30Sean Conneryjs****.com
31Bruce Williske****.com
32Mullah Omarjg****.com
33Vasanta Robertaro****.com

Si quieres saber qué columnas hay disponibles en la vista, puedes usar la sentencia DESCRIBE:

MySQL 8.4
DESCRIBE ViewUsers;
FieldTypeNullKeyDefaultExtra
idintNO<NULL>
namevarchar(32)NO<NULL>
emailvarchar(38)YES<NULL>

Si quieres saber qué columnas hay disponibles en la vista, puedes hacer una consulta a information_schema:

MySQL 8.4
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'viewusers';

Sintaxis general de una vista

MySQL 8.4
CREATE [OR REPLACE]
VIEW nombre_vista [(campo_vista [, ...])]
AS expresion_select;
  • [ ]parte opcional
  • ...se puede repetir
OR REPLACE

Si ya existe una vista con ese nombre, se sustituye por la nueva. Sin OR REPLACE, intentar crear una vista con un nombre ya ocupado termina con un error.

Palabra claveOpcional
nombre_vista

El nombre de la nueva vista. Con él te refieres a la vista en las consultas, igual que a una tabla.

campo_vista

Los nombres de las columnas de la vista. Si no los indicas, las columnas toman los nombres de la consulta SELECT.

Opcional
expresion_select

La consulta SELECT cuyo resultado muestra la vista.

Subconsulta
MySQL 8.4
CREATE [OR REPLACE] VIEW nombre_vista [(campo_vista [, ...])]
AS expresion_select;
  • [ ]parte opcional
  • ...se puede repetir
OR REPLACE

Si ya existe una vista con ese nombre, se sustituye por la nueva. Sin OR REPLACE, intentar crear una vista con un nombre ya ocupado termina con un error. La nueva consulta debe devolver las mismas columnas en el mismo orden; solo puedes añadir columnas nuevas al final.

Palabra claveOpcional
nombre_vista

El nombre de la nueva vista. Con él te refieres a la vista en las consultas, igual que a una tabla.

campo_vista

Los nombres de las columnas de la vista. Si no los indicas, las columnas toman los nombres de la consulta SELECT.

Opcional
expresion_select

La consulta SELECT cuyo resultado muestra la vista.

Subconsulta

Para qué sirven las vistas

Simplificar consultas complejas

Las vistas se usan para simplificar consultas complejas y crear una capa de abstracción entre el usuario y la base de datos. Pueden ocultar la complejidad de la estructura de datos y ofrecer una interfaz simplificada para acceder a los datos.

Mejorar el rendimiento

Crear vistas que encapsulan consultas complejas puede ayudar a optimizar la ejecución de esas consultas. Esto puede hacer que las consultas se ejecuten más rápido y mejorar el rendimiento general de la base de datos.

Crear vistas que encapsulan consultas complejas puede ayudar a optimizar la ejecución de esas consultas. PostgreSQL admite vistas materializadas (MATERIALIZED VIEW), que almacenan físicamente los resultados de la consulta y se actualizan periódicamente, lo que puede mejorar mucho el rendimiento de las consultas complejas.

Garantizar la seguridad

Las vistas se pueden usar para proteger los datos confidenciales. Al crear vistas que limitan el acceso a determinadas columnas o filas, los administradores pueden restringir el acceso a la información sensible. Esto ayuda a garantizar que solo los usuarios autorizados tengan acceso a los datos confidenciales.

Conclusiones

Las vistas son una herramienta importante de SQL que permite simplificar consultas complejas, estandarizar el acceso a los datos, mejorar el rendimiento y garantizar la seguridad de los datos.

Vamos a comprobar si has asimilado el tema: elige la afirmación correcta para la pregunta «¿Qué es una vista en una base de datos?»