CodeGym /Cursos /SQL SELF /Vistas ( VIEW) en PostgreSQL

Vistas ( VIEW) en PostgreSQL

SQL SELF
Nivel 13, Lección 4
Disponible

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
  1. 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
  1. 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;
  1. 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

  1. Creación de informes

Una VIEW — una lógica. Puedes tener report_enrollments_by_month, report_payments_by_year, etc.

  1. Control de acceso

Crea una VIEW que muestre solo datos limitados (por ejemplo, sin datos personales) y da acceso solo a ella.

  1. 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 VIEW en VIEW en VIEW — eso complica el entendimiento y la depuración.
  • Cuida el rendimiento: PostgreSQL recalcula la VIEW en cada consulta, si no es una MATERIALIZED 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.

2
Tarea
SQL SELF, nivel 13, lección 4
Bloqueada
Creación de una vista simple
Creación de una vista simple
2
Tarea
SQL SELF, nivel 13, lección 4
Bloqueada
Vista con unión de datos de varias tablas
Vista con unión de datos de varias tablas
1
Cuestionario/control
SELECT anidados, nivel 13, lección 4
No disponible
SELECT anidados
SELECT anidados
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION