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 |
- 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 |
- 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;
- 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
- Reportistica
Una VIEW — una logica. Puoi creare report_enrollments_by_month, report_payments_by_year ecc.
- Separazione degli accessi
Crea una VIEW che mostra solo dati limitati (tipo senza dati personali) e dai accesso solo a quella.
- 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
VIEWinVIEWinVIEW— complica la vita e il debug. - Occhio alle performance: PostgreSQL ricalcola la
VIEWa ogni query, se non è unaMATERIALIZED 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.
GO TO FULL VERSION