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;| id | nombre | precio | stock | categoria |
|---|---|---|---|---|
| 1 | iPhone 15 Pro | 1299.99 | 45 | Smartphones |
| 2 | Samsung Galaxy S24 | 899.99 | 62 | Smartphones |
| 3 | Google Pixel 8 | 699.00 | 38 | Smartphones |
| 4 | Xiaomi 14 | 599.99 | 80 | Smartphones |
| 5 | MacBook Air M3 | 1399.00 | 25 | Portátiles |
| 6 | Lenovo ThinkPad X1 | 1549.00 | 18 | Portátiles |
| 7 | ASUS ROG Zephyrus | 1899.99 | 12 | Portátiles |
| 15 | Sofá 3 plazas | 599.00 | 8 | Muebles |
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_id | cliente | estado | total | num_productos |
|---|---|---|---|---|
| 25 | Diego Castro Iglesias | cancelado | 149.99 | 1 |
| 24 | Alejandro Serrano Blanco | pendiente | 29.99 | 1 |
| 23 | Paula Ortega Serrano | pendiente | 64.98 | 3 |
| 22 | Fernando Molina Ortega | procesando | 399.00 | 1 |
| 21 | David Sánchez Moreno | enviado | 249.99 | 1 |
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;| nombre | precio | num_resenas | puntuacion_media |
|---|---|---|---|
| Cargador USB-C 65W | 35.99 | 1 | 5.0 |
| MacBook Air M3 | 1399.00 | 1 | 5.0 |
| ASUS ROG Zephyrus | 1899.99 | 1 | 5.0 |
| Clean Code | 39.99 | 2 | 4.5 |
| iPhone 15 Pro | 1299.99 | 2 | 4.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;| categoria | num_pedidos | unidades_vendidas | ingresos |
|---|---|---|---|
| Smartphones | 4 | 4 | 3398.97 |
| Portátiles | 3 | 3 | 3947.99 |
| Muebles | 3 | 3 | 847.99 |
| Running | 3 | 3 | 509.97 |
Ventajas de las vistas
| Ventaja | Descripción |
|---|---|
| Simplicidad | Encapsulan consultas complejas en un nombre simple |
| Reutilización | La misma vista puede usarse en múltiples consultas |
| Seguridad | Los usuarios ven solo las columnas que necesitan |
| Consistencia | La lógica de negocio está definida en un solo lugar |
| Compatibilidad | Si 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_mysql | Table_type |
|---|---|
| v_productos_activos | VIEW |
| v_productos_valorados | VIEW |
| v_resumen_pedidos | VIEW |
| v_ventas_categoria | VIEW |
-- 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
