Sei sulla pagina 1di 20

Corso di Laurea in Ingegneria Gestionale

Sapienza Università di Roma

Corso di Basi di Dati


A.A. 2020/2021

E4 – Esercitazione sulle Viste

Federico Croce

Ultimo aggiornamento : 11/12/2020


Le Viste in SQL
 È possibile creare delle VISTE con l’istruzione CREATE VIEW

 Le Viste sono tabelle virtuali:


 Le tuple sono il risultato di una query che viene valutata dinamicamente
 Nel caso delle interrogazioni, è possibile utilizzarle come delle normali tabelle
 Nel caso degli aggiornamenti, ci sono delle restrizioni per evitare situazioni ambigue

CREATE VIEW NomeVista [ (ListaAttributi) ]


AS Select …
[with check option]

2 Basi di Dati 20/21 Esercitazione sulle viste


Motivazione
 I principali motivi per cui le viste tornano utili, sono i seguenti:
1. Offrire ad utenti diversi una visione personalizzata del DB, potenzialmente astraendosi dalla struttura logica
del DB stesso
2. Risolvere problemi di ristrutturazioni o modifiche dello schema logico
3. Estendere il linguaggio di query e semplificare la scrittura di query complesse

Inoltre, le viste tornano molto utili per:


 Gestire il controllo degli accessi, diversificando i privilegi per ogni classe di utenti

3 Basi di Dati 20/21 Esercitazione sulle viste


Esempio – Modifica dello schema logico
 Si consideri la tabella:
Esami(Matricola, Data, Nome, Cognome, Voto)
 Per evitare di ripetere i dati anagrafici (Nome e Cognome), si decide di dividere la tabella in due
tabelle: Studenti(Matricola, Nome, Cognome) e Prove(Matricola, Data, Voto)

 Come si può garantire il corretto funzionamento dell’applicazione, già in produzione?


 Con una Vista!

CREATE VIEW Esami(Matricola, Nome, Cognome, Data,Voto)


AS SELECT S.*, P.Data, P.Voto
FROM Studenti S, Prove P
WHERE S.Matricola = P.Matricola

4 Basi di Dati 20/21 Esercitazione sulle viste


Esempio – Supporto a query complesse
 Si considerino le tabelle:

Sedi(Codice, Responsabile, Citta)


Impiegati(CodImp, Nome, Sede)

 E la query:
Trovare la sede con il massimo numero di impiegati

5 Basi di Dati 20/21 Esercitazione sulle viste


Esempio – Supporto a query complesse (1/2)
 Senza viste:

SELECT I.Sede
FROM Impiegati I
GROUP BY I.Sede
HAVING COUNT(*) >= ALL( SELECT COUNT(*)
FROM Impiegati I1
GROUP BY I1.Sede)

6 Basi di Dati 20/21 Esercitazione sulle viste


Esempio – Supporto a query complesse (2/2)
 CON viste:

CREATE VIEW NumImp(Sede, NImp)


AS SELECT Sede, COUNT(*)
Si ricorda che in
FROM Impiegati SQL non è
GROUP BY Sede consentito fare
direttamente
MAX(COUNT(*))

SELECT Sede
FROM NumImp
WHERE Nimp = (SELECT MAX(NImp)
FROM NumImp)

7 Basi di Dati 20/21 Esercitazione sulle viste


Esempio2 – Supporto a query complesse
 Con le vista, è anche possibile rispondere ad interrogazioni che richiedono diversi
passi di aggregazione

 Si consideri la query:

Per ogni valore di stipendio medio, numero delle sedi che pagano tale stipendio

8 Basi di Dati 20/21 Esercitazione sulle viste


Esempio2 – Supporto a query complesse
CREATE VIEW StipSedi(Sede, AvgStip)
Crea una tabella virtuale con la media
AS SELECT Sede, AVG(Stipendio)
degli stipendi, per ogni sede
FROM Impiegato Imp
GROUP BY Sede

SELECT AvgStip, COUNT(*) Per ogni stipendio medio, conta il


FROM StipSedi numero di sedi che lo offrono
GROUP BY AvgStip

9 Basi di Dati 20/21 Esercitazione sulle viste


Aggiornamento dei valori nelle viste (1/5)
 Considiamo la vista precedente

CREATE VIEW NumImp(Sede, NImp)


AS SELECT Sede, COUNT(*)
FROM Impiegati
GROUP BY Sede

 Che effetto dovrebbe avere sulle tabelle reali del database, un aggiornamento
del tipo:
UPDATE NumImp
SET NImp = NImp + 1
WHERE Sede = ‘S01’

10 Basi di Dati 20/21 Esercitazione sulle viste


Aggiornamento dei valori nelle viste (2/5)
 La risposta è ambigua

 Per questo, i DBMS hanno delle restrizioni sugli aggiornamenti dei valori
nelle viste

 Le più comuni, riguardano viste che contengono:


 GROUP BY
 Funzioni Aggregate
 DISTINCT
 JOIN (sia impliciti che espliciti)

11 Basi di Dati 20/21 Esercitazione sulle viste


Aggiornamento dei valori nelle viste (3/5)
 Spesso è possibile definire viste equivalenti, senza utilizzare gli operatori su cui
sono previste restrizioni:
CREATE VIEW ImpROMA(CodImp, Nome, Sede)
AS SELECT I.*
FROM Impiegati I JOIN Sedi S ON (I.Sede = S.Sede)
WHERE S.Citta = ‘Roma’

È equivalente a

CREATE VIEW ImpROMA(CodImp, Nome, Sede)


AS SELECT I.*
FROM Impiegati I
WHERE I.Sede IN (SELECT S.Sede FROM Sedi S
WHERE S.Citta = ‘Roma’)

12 Basi di Dati 20/21 Esercitazione sulle viste


Aggiornamento dei valori nelle viste (4/5)
 Esiste un ulteriore problema nell’aggiornamento dei valori nelle viste

 Supponiamo di voler aggiungere un valore non conforme alla definizione della


vista, cioè che non sarebbe nelle tuple dinamicamente create dalla vista in cui
vogliamo aggiungerlo. Cosa dovrebbe fare il DB?

Ad esempio, nella vista ImpROMA:


INSERT INTO ImpROMA(CodImp, Nome, Sede)
VALUES (‘0124’, ‘Mario’, ‘S02’)
Dove la sede associata al codice ‘S02’ si trova a Milano

13 Basi di Dati 20/21 Esercitazione sulle viste


Aggiornamento dei valori nelle viste (5/5)
 È possibile definire una clausola nella creazione della vista, che permette solo
l’inserimento di quei valori che sarebbero anche restituiti dalla vista stessa

CREATE VIEW ImpROMA(CodImp, Nome, Sede)


AS SELECT I.*
FROM Impiegati I
WHERE I.Sede IN (SELECT S.Sede FROM Sedi S
WHERE S.Citta = ‘Roma’)
WITH [CASCADED | LOCAL] CHECK OPTION

14 Basi di Dati 20/21 Esercitazione sulle viste


Esercizio Proposto
 Date le seguenti tabelle:

Impiegato
Nome Cognome Dipart StipAnn

Dipartimento
Nome Citta

 Calcolare le seguenti interrogazioni:

15 Basi di Dati 20/21 Esercitazione sulle viste


Esercizio Proposto (1/5)
Impiegato
Nome Cognome Dipart StipAnn

Dipartimento
Nome Citta

Creare una vista che ritorni, per ogni città, la media degli stipendi degli impiegati che lavorano nei dipartimenti di
quella città

CREATE VIEW MediaStipendiLavoratori(Citta, MediaStip) AS


SELECT D.Citta, AVG(StipAnn)
FROM Dipartimento D, Impiegato I
WHERE D.Nome = I.Dipart
GROUP BY Citta

16 Basi di Dati 20/21 Esercitazione sulle viste


Esercizio Proposto (2/5)
Impiegato
Nome Cognome Dipart StipAnn

Dipartimento
Nome Citta

Estrarre il dipartimento in cui la somma degli stipendi degli impiegati che vi lavorano è massima rispetto agli altri
dipartimenti

CREATE VIEW SommaStipendi(Dipart, Stip) AS SELECT Dipart


SELECT Dipart, sum(StipAnn) FROM SommaStipendi
FROM Impiegato WHERE Stip = (SELECT max(Stip)
GROUP BY Dipart FROM SommaStipendi)

17 Basi di Dati 20/21 Esercitazione sulle viste


Esercizio Proposto (3/5)
Impiegato
Nome Cognome Dipart StipAnn

Dipartimento
Nome Citta

Definire una vista che mostri per ogni dipartimento, il valore medio degli stipendi superiori alla media del
dipartimento
CREATE VIEW SalariSopraMedia(Dipartimento, Stipendio) AS
SELECT Dipart, avg(StipAnn)
FROM Impiegato I
WHERE StipAnn > (SELECT avg(StipAnn)
FROM Impiegato J
WHERE J.Dipart = I.Dipart)
GROUP BY Dipart

18 Basi di Dati 20/21 Esercitazione sulle viste


Esercizio Proposto (4/5)
Impiegato
Nome Cognome Dipart StipAnn

Dipartimento
Nome Citta

Definire una vista che ritorni gli impiegati del dipartimento ‘DIAG’

CREATE VIEW ImpDIAG(Nome, Cognome, Dipart, StipAnn) AS


SELECT *
FROM Impiegato
WHERE Dipart = ‘DIAG’

19 Basi di Dati 20/21 Esercitazione sulle viste


Esercizio Proposto (5/5)
Impiegato
Nome Cognome Dipart StipAnn

Dipartimento
Nome Citta

Trovare il nome degli impiegati del dipartimento ‘DIAG’ che guadagnano più di €40k

SELECT DISTINCT Nome


FROM ImpDIAG
WHERE StipAnn > 40000

20 Basi di Dati 20/21 Esercitazione sulle viste