Às vezes as queries SQL ficam grandes demais, complicadas e repetitivas. Tipo, você monta um relatório de estudantes com as médias das notas e a quantidade de cursos — e acaba escrevendo o mesmo subquery em cinco lugares diferentes. Pra não ficar copiando tudo de novo, usa uma view — ou seja, um VIEW.
VIEW é tipo uma “query salva”, que você pode dar um nome e usar como se fosse uma tabela. Ela não guarda os dados, só a estrutura da query.
Isso é especialmente útil quando você quer:
- deixar o SQL mais fácil de ler;
- reaproveitar uma seleção complicada;
- esconder detalhes técnicos dos usuários;
- separar níveis de acesso (mostrar só os dados que precisa).
Como funciona um VIEW?
Criar uma view é tipo criar uma pseudo-tabela baseada numa query SELECT. Por exemplo:
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;
Agora você pode usar student_avg_grades como se fosse uma tabela normal:
SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;
Exemplo da faculdade
Você vive analisando estudantes, os cursos deles e as notas. Imagina que precisa montar um relatório resumido pra cada estudante:
- nome,
- quantidade de matrículas em cursos,
- nota média.
Se tentar fazer tudo numa query só — vai ficar gigante e difícil de entender. Muito melhor dividir a tarefa: primeiro cria duas views (VIEW), depois junta elas.
Tabela students
| id | name |
|---|---|
| 1 | Alex Lin |
| 2 | Anna Song |
| 3 | Maria Chi |
| 4 | Dan Seth |
Tabela enrollments
| student_id | course_id | grade |
|---|---|---|
| 1 | 1 | 90 |
| 1 | 2 | 85 |
| 2 | 2 | 88 |
| 2 | 3 | 91 |
| 3 | 1 | 75 |
| 3 | 3 | NULL |
- View: quantidade de cursos
Essa view conta quantos cursos cada estudante tem:
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 |
- View: nota média E essa aqui — a nota média do estudante (se não tem nota — NULL, e não conta):
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;
- Usando essas
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;
Agora sua query tá limpa e fácil de entender. E o melhor — fica fácil de manter.
Atualização de VIEW
Views normalmente não guardam dados — são só um "envelope" em volta da query. Mas dá pra usar até pra atualizar dados, se a VIEW seguir algumas regras (tipo, sem JOIN, GROUP BY, agregações e subqueries).
Exemplo de view que pode ser atualizada:
CREATE VIEW active_students AS
SELECT * FROM students WHERE active = true;
Agora dá pra rodar:
UPDATE active_students SET name = 'Ivan Petrov' WHERE student_id = 2;
Mas se a VIEW for complicada (tipo, tem JOIN ou GROUP BY), ela vira só leitura. Pra atualizar, dá pra usar triggers INSTEAD OF, mas aí já é nível avançado.
Como apagar ou mudar uma VIEW
Apagar:
DROP VIEW student_avg_grade;
Atualizar:
CREATE OR REPLACE VIEW student_avg_grade AS
SELECT student_id, ROUND(AVG(grade), 2) AS avg_grade
FROM grades
GROUP BY student_id;
Exemplos: quando VIEW é especialmente útil
- Relatórios
Uma VIEW — uma lógica. Você pode criar report_enrollments_by_month, report_payments_by_year e por aí vai.
- Separar acesso
Cria uma VIEW que mostra só dados limitados (tipo, sem dados pessoais) e libera acesso só pra ela.
- Reaproveitar
Ao invés de copiar um subquery — dá um nome pra ele como VIEW.
Dicas
- Dê nomes que façam sentido:
view_avg_scores_by_group,active_users_view— assim fica fácil de ler. - Não faça cadeia de
VIEWemVIEWemVIEW— isso só complica pra entender e debugar. - Fique de olho na performance: O PostgreSQL recalcula a
VIEWtoda vez que você consulta, se não for umMATERIALIZED VIEW.
VIEW é uma das ferramentas mais simples e úteis do PostgreSQL. Não precisa aprender nada novo, só mudar o jeito de pensar: “Será que não vale salvar essa query e usar como tabela?” Se sua query tá ficando gigante — provavelmente ela merece virar uma VIEW.
GO TO FULL VERSION