Vai al contenuto
eLearner.app
Modulo 9 · Lezione 4 di 436/57 nel corso~12 min
Lezioni del modulo (4/4)

Viste e astrazione dei dati

Nel corso delle nostre lezioni avrai notato che le queries (in particolar modo i JOIN complessi o le aggregazioni come il GROUP BY) iniziano a farsi lunghe e piene di regole e calcoli.

E se ci fosse un modo per salvare mentalmente la query compiuta e nasconderla alla vista, fingendo d'ora in poi che essa sia a tutti gli effetti una normale "tabella" del DB?

Benvenuto nel mondo delle Viste (Views).

CREATE VIEW

Una vista è essenzialmente una query SQL persistita e con un nome, ma si comporta proprio come una tabella "virtuale"!

SQL
CREATE VIEW user_spending AS
SELECT
  c.id,
  c.first_name,
  SUM(o.amount) as total_spent
FROM customers c
JOIN orders o ON c.id = o.customer_id
GROUP BY c.id;

Fatto! Ora, invece di dover sempre rifare quel JOIN ed il GROUP BY, ti basterà fare normalissime queries:

SQL
SELECT * FROM user_spending WHERE total_spent > 100;
-- Postgres dietro le quinte richiamerà automaticamente la grande formula.

Le Viste ed i "dati in tempo reale"

Un falso mito molto comune è pensare che le Views prendano i dati, calcolino le somme come i prezzi o le classifiche e ne facciano uno squallido screenshot, come una fotografia persistita. Sbagliato (quasi sempre)! Standard, le View sono virtuali: ogni volta che metti nella SELECT il nome di una View, Postgres dietro le quinte fonderà la tua richiesta eseguendo al volo un calcolo in tempo reale basato sullo stato del DB di quell'esatto millisecondo. Non leggerai quindi mai un dato stantio.

A che servono?

  • Semplicità: le views proteggono le app esterne dai cambiamenti. Se il team del frontend sa di dover leggere i dati dalla view top_selling, esso non dovrà preoccuparsi se domani modifichiamo il database aggiungendo tre relazioni intermedie per tirare fuori i top selling!
  • Sicurezza e segregazione: in DB enormi, una view può pre-selezionare e nascondere parte dei dati degli utenti agli sviluppatori esterni concedendovi solo di accedere (es) ad una sub-vista di analitiche depurate di nomi veri.

Eliminare una View

Così come le tabelle, qualora non servisse si procede con il comando DROP:

SQL
DROP VIEW user_spending;

Prova tu

Esercizio#sql.m9.l4.e1
Tentativi: 0Caricamento…

Crea una vista (VIEW) chiamata 'high_value_products'. Deve comportarsi come un raccoglitore in cui selezionare tutti e 3 i campi essenziali (`id`, `name`, `price`) dalla tabella 'products', MA solo e sempre di quei prodotti che hanno un 'price' maggiore di 50.00.

Caricamento editor…
Mostra suggerimento

Scrivi CREATE VIEW nome_vista AS SELECT ... FROM ... WHERE ...

Soluzione disponibile dopo 3 tentativi

Richiamare una Vista

Esercizio#sql.m9.l4.e2
Tentativi: 0Caricamento…

Visto che ogni esercizio della piattaforma è eseguito in un ambiente isolato (e pulito), la vista di prima non esiste più in questo step. Ricrea la vista 'high_value_products' (sempre coi prodotti aventi price > 50) e poi, nella riga immediatamente suseguente, esegui una SELECT di tutto il suo contenuto ordinando per prezzo decrescente (DESC) per verificare che funzioni.

Caricamento editor…
Mostra suggerimento

Non scordare il ; tra le dichiarazioni SQL (crealo a fine prima riga)! Questo permette a Postgres di eseguire i 2 task in parata.

Soluzione disponibile dopo 3 tentativi