Viste
Generalità
Oltre alle tabelle di base che fanno parte dello schema si possono creare delle tabelle ausiliarie virtuali (le viste) in quando non sono fisicamente presenti sul nostro database ma vengono create “al volo”. Queste sono molto utili per vari motivi:
- Semplificazione
- Protezione dei dati
- Scomposizione di query complesse
Sintassi ed esempi
Praticamente quello che facciamo è dare un nome ad una select, questa cosa nell’esempio di seguito è palese:
CREATE VIEW MediaVoti (Matricola,Media) AS
SELECT Matricola, AVG(Voto)
FROM Esami
GROUP BY MatricolaTrattiamo la nostra view come se fosse una vera è propria tabella quindi per interrogarla facciamo semplicemente:
SELECT * FROM MediaVotiI vari usi delle VIEW
Uso delle view per semplificare delle query complesse
CREATE VIEW AgPerZona (Zona,NumAg)
AS
SELECT Zona,COUNT(*) FROM AGENTI GROUP BY Zona
SELECT AVG(NumAg) FROM AgPerZona
SELECT AVG(NumAg)
FROM (SELECT Zona,COUNT(*) as NumAg
FROM AGENTI
GROUP BY Zona
)Uso delle view per sicurezza Data la tabella ClientiBanca(Nome, Indirizzo, Saldo)
CREATE VIEW ClientiInd AS SELECT Nome,Indirizzo FROM ClientiBancaLa creazione di questa view potrebbe salvaguardare un minimo la privacy delle persone impedendo ad utenti non autorizzati di sapere il loro saldo
Uso delle view come tabelle Le view possono essere utilizzate come vere è proprie tabelle con quindi tutti i comandi che ne conseguono: INSERT, UPDATE, DROP, ecc Ovviamente essendo trattate come tabelle possiamo fare delle viste di una vista.
Aggiornamento delle VIEW
QUESTION
Le operazioni di INSERT/UPDATE/DELETE sulle view ovviamente sono permesse, ma che senso hanno?
Sono utili nel caso di accesso dati controllato. Esempio: Data la tabella seguente tabella:
- Impiegato( Nome, Cognome, Dipart, Ufficio, Stipendio) Il personale della segreteria non può accedere ai dati sullo stipendio ma può modificare gli altri campi della tabella, quindi si crea una view e dedicata al personale della segreteria senza lo stipendi, quando questi andranno ad inserire valori dentro la view ci sono due strade:
- Stipendio diventa null o qualsiasi altro valore default
- Operazione fallisce se lo stipendio non può avere null
Check option sulle View
CREATE VIEW ImpiegatoRossi AS SELECT * FROM Impiegato WHERE Cognome=‘Rossi’- INSERT INTO ImpiegatoRossi (…’Rossi’,…)
- INSERT INTO ImpiegatoRossi (…’Bianchi’,…)
Entrambe queste operazioni sono permesse, ma ovviamente quando la seconda verrà fatta non ci sarà nessuna modifica alla vista
Ovviamente logicamente non ha molto senso che anche la seconda venga effettuata, qui nasce il bisogno di utilizzare WITH CHECK OPTION che va a fare un vero è proprio controllo sui comandi di modifica della view per vedere se rispettano i vincoli del where
CREATE VIEW ImpiegatoRossi AS SELECT * FROM Impiegato WHERE Cognome=‘Rossi’ WITH CHECK OPTIONEsempi

Algebra relazionale: limiti
Ci sono delle interrogazioni che non possono essere espresse usando l”algebra relazionale, come:
- Calcolo di valori derivati: possiamo solo estrarre valori non calcolarne di nuovi
- Interrogazioni ricorsive: le interrogazioni ricorsive come la chiusura transitiva non sono possibili
Chiusura transitiva
In algebra relazionale questa interrogazione non è risolvibile perché servirebbero un numero di join infinite, con ridenominazioni ogni volta diverse, in sql invece si può fare, di seguito un esempio del calcolo del fattoriale (tipico esempio di ricorsività) in SQL
WITH RECURSIVE factorial (n, fact) AS (
SELECT 0, 1 -- Initial Subquery
UNION ALL
SELECT n+1, (n+1)*fact
FROM factorial -- Recursive Subquery
WHERE n < 9
)
SELECT * FROM factorial;Di seguito un esempio con un applicazione reale:
- Per ogni persona, trovare tutti gli antenati avendo: Paternita(Padre, Figlio)

Funzioni scalari
Esistono delle funzioni che agiscono a livello di ennupla per estrarre delle informazioni dal dato, come:
- current_date
- extract(year from data)
- char_length
- lower
- CAST(X as Tipo)
- ecc..
Funzioni condizionali
- Case: è una struttura simile a if-then-else (sarebbe uno switch case)
- Coalesce: modifica il valore null in qualcosa che passiamo
- NULLIF: Restituisce NULL se i due argomenti che riceve sono uguali; altrimenti restituisce il primo argomento. È spesso usata per prevenire errori di divisione per zero.
SELECT Nome, Cognome, COALESCE(Dipart,'Ignoto')
FROM Impiegato
SELECT Targa,
CASE Tipo
WHEN 'Auto' THEN 2.58 * KWatt
WHEN 'Moto' THEN (22.00 + 1.00 * KWatt)
ELSE NULL
END AS Tassa
FROM Veicolo
WHERE Anno > 1975