Vistas: consultas con nombre
Una vista (VIEW) es una consulta guardada a la que pones nombre. No
almacena datos: cada vez que la usas, se ejecuta su SELECT por debajo. Sirve
para no repetir consultas complejas y para dar nombres claros al equipo.
CREATE VIEW productos_caros AS
SELECT nombre, categoria, precio
FROM productos
WHERE precio >= 200;
A partir de ahí, la usas como si fuera una tabla:
SELECT * FROM productos_caros ORDER BY precio DESC;
SELECT categoria, COUNT(*) FROM productos_caros GROUP BY categoria;
Una vista siempre refleja los datos actuales de las tablas base: si cambian los productos, la vista los muestra al instante (no hay copia que actualizar).
CTEs: el WITH
Una CTE (Common Table Expression) es una consulta temporal con nombre que
solo vive durante la consulta en la que se declara, con WITH:
WITH caros AS (
SELECT * FROM productos WHERE precio >= 200
)
SELECT categoria, AVG(precio) FROM caros GROUP BY categoria;
Frente a una vista, la CTE es local (no queda guardada) y hace la consulta más legible al separarla en pasos.
CTEs recursivas (intro)
Con WITH RECURSIVE una CTE puede referirse a sí misma, ideal para generar
series o recorrer jerarquías. Tiene dos partes unidas por UNION ALL:
WITH RECURSIVE numeros(n) AS (
SELECT 1 -- caso base: el punto de partida
UNION ALL
SELECT n + 1 FROM numeros -- paso recursivo: usa la fila anterior
WHERE n < 5 -- condición de parada (¡imprescindible!)
)
SELECT n FROM numeros;
- Caso base: las primeras filas, sin recursión.
- Paso recursivo: se ejecuta una y otra vez sobre las filas ya generadas.
- Condición de parada: sin ella, la recursión sería infinita.
Ejemplos
Crear una vista y consultarla
CREATE VIEW productos_caros AS
SELECT nombre, categoria, precio
FROM productos
WHERE precio >= 200;
SELECT * FROM productos_caros ORDER BY precio DESC;
Generar la serie 1..5 con una CTE recursiva
WITH RECURSIVE numeros(n) AS (
SELECT 1
UNION ALL
SELECT n + 1 FROM numeros WHERE n < 5
)
SELECT n FROM numeros ORDER BY n;