CodeGym /Corsi /SQL SELF /View (`VIEW`) in PostgreSQL

View (`VIEW`) in PostgreSQL

SQL SELF
Livello 13 , Lezione 4
Disponibile

A volte le query SQL diventano troppo lunghe, complicate e ripetitive. Tipo, stai facendo un report sugli studenti con le loro medie e il numero di corsi — e scrivi sempre la stessa sottoquery in cinque punti diversi. Per non copiare sempre la stessa roba, usa le view — cioè le VIEW.

VIEW è tipo una “query salvata” a cui puoi dare un nome e usarla come fosse una tabella. Non salva i dati, solo la struttura della query.

È super utile quando vuoi:

  • rendere il codice SQL più leggibile;
  • riutilizzare selezioni complesse;
  • nascondere dettagli tecnici agli utenti;
  • separare i livelli di accesso (mostrare solo i dati che servono).

Come funziona una VIEW?

Creare una view vuol dire creare una pseudo-tabella basata su una query SELECT. Tipo così:

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;

Ora puoi usare student_avg_grades come fosse una tabella normale:

SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;

Esempio dall’università

Spesso analizzi studenti, i loro corsi e i voti. Immagina che devi fare un report riassuntivo per ogni studente:

  • nome,
  • numero di iscrizioni ai corsi,
  • media voti.

Se provi a fare tutto in una sola query — viene fuori una roba lunga e illeggibile. Molto meglio spezzare il problema: prima creiamo due view (VIEW), poi le uniamo.

Tabella students

id name
1 Alex Lin
2 Anna Song
3 Maria Chi
4 Dan Seth

Tabella 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. View: numero di corsi

Questa view conta quanti corsi ha ogni studente:

CREATE VIEW student_course_count AS
SELECT 
    student_id,
    COUNT(*) AS course_count
FROM 
    enrollments
GROUP BY student_id;

Risultato:

name
Alex Lin
Anna Song
Maria Chi
  1. View: media voti E questa — la media dei voti dello studente (se non c’è voto — NULL, e non influisce):
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 di queste 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;

Ora hai una query pulita e chiara. E soprattutto — è facile da mantenere.

Aggiornabilità delle VIEW

Le view di solito non contengono dati — sono solo un "wrapper" sopra una query. Però, puoi usarle anche per aggiornare i dati, se la VIEW rispetta alcune condizioni (tipo, senza JOIN, GROUP BY, aggregazioni e sottoquery).

Esempio di view aggiornabile:

CREATE VIEW active_students AS
SELECT * FROM students WHERE active = true;

Ora puoi fare:

UPDATE active_students SET name = 'Ivan Petrov' WHERE student_id = 2;

Ma se la VIEW è complessa (tipo contiene JOIN o GROUP BY), diventa sola lettura. Per aggiornare puoi usare i INSTEAD OF trigger, ma questa è roba avanzata.

Come eliminare o modificare una VIEW

Eliminare:

DROP VIEW student_avg_grade;

Aggiornare:

CREATE OR REPLACE VIEW student_avg_grade AS
SELECT student_id, ROUND(AVG(grade), 2) AS avg_grade
FROM grades
GROUP BY student_id;

Esempi: quando la VIEW è davvero utile

  1. Reportistica

Una VIEW — una logica. Puoi creare report_enrollments_by_month, report_payments_by_year ecc.

  1. Separazione degli accessi

Crea una VIEW che mostra solo dati limitati (tipo senza dati personali) e dai accesso solo a quella.

  1. Riutilizzo

Invece di copiare una sottoquery — dagli un nome come VIEW.

Consigli

  • Dai nomi chiari: view_avg_scores_by_group, active_users_view — così si leggono meglio.
  • Non fare catene di VIEW in VIEW in VIEW — complica la vita e il debug.
  • Occhio alle performance: PostgreSQL ricalcola la VIEW a ogni query, se non è una MATERIALIZED VIEW.

VIEW è uno degli strumenti più semplici e comodi in PostgreSQL. Non serve imparare cose nuove, solo cambiare mentalità: «E se salvassi questa query e la usassi come tabella?» Se la tua query diventa pesante — probabilmente merita di diventare una VIEW.

1
Sondaggio/quiz
SELECT annidati, livello 13, lezione 4
Non disponibile
SELECT annidati
SELECT annidati
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION