A veces las consultas SQL se vuelven demasiado largas, complicadas y repetitivas. Por ejemplo, estás haciendo un informe de estudiantes con sus notas medias y el número de cursos — y escribes la misma subconsulta en cinco sitios distintos. Para no copiar lo mismo una y otra vez, usa vistas — o VIEW.
VIEW es como una “consulta guardada” a la que puedes ponerle un nombre y tratarla como si fuera una tabla. No guarda datos, solo la estructura de la consulta.
Esto es especialmente útil cuando quieres:
- hacer el código SQL más fácil de leer;
- reutilizar una selección compleja;
- ocultar detalles técnicos a los usuarios;
- controlar los niveles de acceso (mostrar solo los datos necesarios).
¿Cómo funciona una VIEW?
Crear una vista significa crear una pseudotabla basada en una consulta SELECT. Por ejemplo:
CREATE VIEW student_avg_grades AS
SELECT
s.student_id,
s.name,
AVG(g.grade) AS avg_grade
FROM
students s
JOIN
grades g ON s.student_id = g.student_id
GROUP BY
s.student_id, s.name;
Ahora puedes consultar student_avg_grades como si fuera una tabla normal:
SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;
Ejemplo universitario
A menudo analizas estudiantes, sus cursos y notas. Imagina que necesitas hacer un informe resumen para cada estudiante:
- nombre,
- número de inscripciones en cursos,
- nota media.
Si intentas hacer esto de una sola vez — te sale un SQL largo y difícil de leer. Mucho mejor dividir la tarea: primero creamos dos vistas (VIEW), y luego las juntamos.
Tabla students
| id | name |
|---|---|
| 1 | Alex Lin |
| 2 | Anna Song |
| 3 | Maria Chi |
| 4 | Dan Seth |
Tabla enrollments
| student_id | course_id | grade |
|---|---|---|
| 1 | 1 | 90 |
| 1 | 2 | 85 |
| 2 | 2 | 88 |
| 2 | 3 | 91 |
| 3 | 1 | 75 |
| 3 | 3 | NULL |
- Vista: número de cursos
Esta vista cuenta cuántos cursos tiene cada estudiante:
CREATE VIEW student_course_count AS
SELECT
student_id,
COUNT(*) AS course_count
FROM
enrollments
GROUP BY student_id;
Resultado:
| name |
|---|
| Alex Lin |
| Anna Song |
| Maria Chi |
- Vista: nota media Y esta es la nota media del estudiante (si no hay nota — NULL, y no cuenta):
CREATE VIEW student_avg_grade AS
SELECT
student_id,
AVG(grade) AS avg_grade
FROM
enrollments
WHERE grade IS NOT NULL
GROUP BY student_id;
- Uso de estas
VIEW
SELECT
s.name,
c.course_count,
a.avg_grade
FROM
students s
LEFT JOIN student_course_count c ON s.student_id = c.student_id
LEFT JOIN student_avg_grade a ON s.student_id = a.student_id;
Ahora tienes una consulta limpia y fácil de entender. Y lo mejor — es fácil de mantener.
Actualizabilidad de las VIEW
Las vistas normalmente no contienen datos — son solo un "envoltorio" sobre una consulta. Sin embargo, puedes usarlas incluso para actualizar datos, si la VIEW cumple ciertas condiciones (por ejemplo, sin JOIN, GROUP BY, agregados ni subconsultas).
Ejemplo de vista actualizable:
CREATE VIEW active_students AS
SELECT * FROM students WHERE active = true;
Ahora puedes hacer:
UPDATE active_students SET name = 'Iván Petrov' WHERE student_id = 2;
Pero si la VIEW es compleja (por ejemplo, tiene JOIN o GROUP BY), se vuelve solo de lectura. Para actualizaciones puedes usar triggers INSTEAD OF, pero eso ya es nivel avanzado.
Cómo borrar o modificar una VIEW
Borrar:
DROP VIEW student_avg_grade;
Actualizar:
CREATE OR REPLACE VIEW student_avg_grade AS
SELECT student_id, ROUND(AVG(grade), 2) AS avg_grade
FROM grades
GROUP BY student_id;
Ejemplos: cuándo una VIEW es especialmente útil
- Creación de informes
Una VIEW — una lógica. Puedes tener report_enrollments_by_month, report_payments_by_year, etc.
- Control de acceso
Crea una VIEW que muestre solo datos limitados (por ejemplo, sin datos personales) y da acceso solo a ella.
- Reutilización
En vez de copiar una subconsulta — ponle nombre como VIEW.
Consejos
- Pon nombres claros:
view_avg_scores_by_group,active_users_view— así es más fácil de leer. - No hagas cadenas de
VIEWenVIEWenVIEW— eso complica el entendimiento y la depuración. - Cuida el rendimiento: PostgreSQL recalcula la
VIEWen cada consulta, si no es unaMATERIALIZED VIEW.
VIEW es una de las herramientas más sencillas y cómodas en PostgreSQL. No necesitas aprender nada nuevo, solo cambiar el chip: «¿Y si guardo esta consulta y la uso como tabla?» Si tu consulta se está volviendo enorme — casi seguro que merece ser una VIEW.
GO TO FULL VERSION