CREATE VIEW

Una vista es una tabla virtual basada en el resultado de una consulta SQL. No almacena datos propios; cada vez que consultas una vista, MySQL ejecuta la consulta subyacente. Las vistas simplifican consultas complejas, encapsulan lógica de negocio y permiten controlar qué datos pueden ver los usuarios.

Sintaxis

CREATE VIEW nombre_vista AS
SELECT columnas
FROM tabla
WHERE condicion;

Ejemplo básico

-- Vista de productos activos con su categoría
CREATE VIEW v_productos_activos AS
SELECT
    p.id,
    p.nombre,
    p.precio,
    p.stock,
    c.nombre AS categoria
FROM productos p
JOIN categorias c ON p.categoria_id = c.id
WHERE p.activo = TRUE;
 
-- Usar la vista como si fuera una tabla
SELECT * FROM v_productos_activos WHERE precio > 500;
idnombrepreciostockcategoria
1iPhone 15 Pro1299.9945Smartphones
2Samsung Galaxy S24899.9962Smartphones
3Google Pixel 8699.0038Smartphones
4Xiaomi 14599.9980Smartphones
5MacBook Air M31399.0025Portátiles
6Lenovo ThinkPad X11549.0018Portátiles
7ASUS ROG Zephyrus1899.9912Portátiles
15Sofá 3 plazas599.008Muebles

Vistas en tienda_mysql

Vamos a crear varias vistas útiles para nuestra base de datos:

Resumen de pedidos

CREATE VIEW v_resumen_pedidos AS
SELECT
    p.id AS pedido_id,
    CONCAT(c.nombre, ' ', c.apellidos) AS cliente,
    CONCAT(e.nombre, ' ', e.apellidos) AS empleado,
    p.fecha_pedido,
    p.estado,
    p.total,
    COUNT(d.id) AS num_productos
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
LEFT JOIN empleados e ON p.empleado_id = e.id
JOIN detalle_pedidos d ON p.id = d.pedido_id
GROUP BY p.id;
 
SELECT pedido_id, cliente, estado, total, num_productos
FROM v_resumen_pedidos
ORDER BY pedido_id DESC
LIMIT 5;
pedido_idclienteestadototalnum_productos
25Diego Castro Iglesiascancelado149.991
24Alejandro Serrano Blancopendiente29.991
23Paula Ortega Serranopendiente64.983
22Fernando Molina Ortegaprocesando399.001
21David Sánchez Morenoenviado249.991

Productos con valoraciones

CREATE VIEW v_productos_valorados AS
SELECT
    p.id,
    p.nombre,
    p.precio,
    COUNT(r.id) AS num_resenas,
    ROUND(AVG(r.puntuacion), 1) AS puntuacion_media
FROM productos p
LEFT JOIN resenas r ON p.id = r.producto_id
GROUP BY p.id;
 
SELECT nombre, precio, num_resenas, puntuacion_media
FROM v_productos_valorados
WHERE num_resenas > 0
ORDER BY puntuacion_media DESC
LIMIT 5;
nombreprecionum_resenaspuntuacion_media
Cargador USB-C 65W35.9915.0
MacBook Air M31399.0015.0
ASUS ROG Zephyrus1899.9915.0
Clean Code39.9924.5
iPhone 15 Pro1299.9924.5

Ventas por categoría

CREATE VIEW v_ventas_categoria AS
SELECT
    c.nombre AS categoria,
    COUNT(DISTINCT d.pedido_id) AS num_pedidos,
    SUM(d.cantidad) AS unidades_vendidas,
    SUM(d.cantidad * d.precio_unitario) AS ingresos
FROM categorias c
JOIN productos p ON p.categoria_id = c.id
JOIN detalle_pedidos d ON d.producto_id = p.id
GROUP BY c.id;
 
SELECT * FROM v_ventas_categoria ORDER BY ingresos DESC;
categorianum_pedidosunidades_vendidasingresos
Smartphones443398.97
Portátiles333947.99
Muebles33847.99
Running33509.97

Ventajas de las vistas

VentajaDescripción
SimplicidadEncapsulan consultas complejas en un nombre simple
ReutilizaciónLa misma vista puede usarse en múltiples consultas
SeguridadLos usuarios ven solo las columnas que necesitan
ConsistenciaLa lógica de negocio está definida en un solo lugar
CompatibilidadSi la tabla cambia, puedes actualizar la vista sin cambiar las consultas

Usar vistas en JOINs

Las vistas se pueden usar como tablas en cualquier consulta:

-- JOIN entre una vista y una tabla
SELECT
    v.nombre,
    v.puntuacion_media,
    c.nombre AS categoria
FROM v_productos_valorados v
JOIN productos p ON v.id = p.id
JOIN categorias c ON p.categoria_id = c.id
WHERE v.num_resenas > 0
ORDER BY v.puntuacion_media DESC;

Ver vistas existentes

SHOW FULL TABLES WHERE Table_type = 'VIEW';
Tables_in_tienda_mysqlTable_type
v_productos_activosVIEW
v_productos_valoradosVIEW
v_resumen_pedidosVIEW
v_ventas_categoriaVIEW
-- Ver la definición de una vista
SHOW CREATE VIEW v_productos_activos;

Limpieza

DROP VIEW IF EXISTS v_productos_activos;
DROP VIEW IF EXISTS v_resumen_pedidos;
DROP VIEW IF EXISTS v_productos_valorados;
DROP VIEW IF EXISTS v_ventas_categoria;

En el siguiente artículo veremos las vistas actualizables, que permiten insertar, actualizar y eliminar datos a través de una vista.

Escrito por Eduardo Lázaro