SQL$Avanzato$ Interrogazioni$e$il$valore$NULL$

Transcript

SQL$Avanzato$ Interrogazioni$e$il$valore$NULL$
SQL$Avanzato$
!
Interrogazioni+complesse,+trigger,+viste+e+modifiche+dello+schema+
2
Interrogazioni$e$il$valore$NULL$
Giorgio Giacinto 2011
!
3
Il valore NULL
Logica a tre valori
!  Significato del valore NULL
!  Valore sconosciuto
!  Valore non disponibile
!  Attributo non applicabile
!  Ciascun valore NULL è quindi considerato
diverso dagli altri valori NULL!
!  SQL usa una logica a tre valori:
!  TRUE, FALSE, and UNKNOWN!
Giorgio Giacinto 2011
4
La logica a tre valori
Giorgio Giacinto 2011
5
Interrogazioni e logica a tre valori
!  SQL consente di verificare se il valore di un
attributo è NULL!
!  IS or IS NOT NULL!
!  Di+solito+le+interrogazioni+res7tuiscono+solo+le+tuple+la+
cui+condizione+di+selezione+è+TRUE+
!  Le+tuple+per+le+quali+il+valore+è+FALSE+o+UNKNOWN+
vengono+scartate+
Giorgio Giacinto 2011
6
Interrogazioni$complesse$
Giorgio Giacinto 2011
!
7
Interrogazioni annidate
!  Blocchi completi select-from-where usati
all’interno della clausola WHERE di un’altra
interrogazione
!  chiamata interrogazione esterna
!  Operatore di confronto IN!
!  Confronta un valore v con un insieme (o
multinsieme) di valori V
!  Restituisce TRUE se v è uno degli elementi di V
Giorgio Giacinto 2011
8
Interrogazione 4$rivista
!  Creare+un+elenco+di+tuH+i+numeri+di+progeIo+rela7vi+a+progeH+
che+coinvolgono+dipenden7+di+cognome+‘Smith’+come+
partecipante+o+come+direIore+di+dipar7mento+che+controlla+il+
progeIo+
Giorgio Giacinto 2011
+
+SELECT&&&&&DISTINCT&Pnumber+
+FROM&&&&&&Project+
+WHERE&&&&dnum+IN&
&
&
&(SELECT&&Dnumber+
+
+
++FROM &Department,+Employee+
+
+
++WHERE+mgrssn+=+ssn+AND+lname+=+‘Smith’)+
&OR&Pnumber+IN&
&
&
&(SELECT &&pno+
+
+
++FROM ++Works_on,+Employee+
+
+
++WHERE&&essn+=+ssn+AND+lname+=+‘Smith’)+
9
Confronto di tuple
!  La clausola WHERE di interrogazioni annidate
può contenere confronti su tuple
Giorgio Giacinto 2011
10
Altri operatori di confronto
!  = ANY (or = SOME) operator
!  Restituisce TRUE se il valore di v iè uguale ad
almeno uno dei valori nell’insieme V
!  equivalente all’operatore IN!
!  ANY (or SOME) può essere combinato anche ad
altri operatori: >, >=, <, <=, e <>!
Giorgio Giacinto 2011
11
Alias per le relazioni nel FROM
!  Una stessa tabella può comparire più volte in
interrogazioni annidate
!  Per evitare ambiguità fra i nomi degli attributi è
bene
!  creare alias (variabili di tupla) per ogni relazione
!  e qualificare tutti gli attributi con l’alias della
relazione cui si riferiscono
!  In assenza di alias gli attributi ambigui vengono
associati alla relazione dichiarata nella
interrogazione nidificata più interna
Giorgio Giacinto 2011
12
Interrogazione 16$
!  Si+trovi+il+nome+di+ciascun+dipendente+che+ha+una+
persona+a+carico+con+il+medesimo+nome+di+
baIesimo+e+lo+stesso+sesso+del+dipendente+
Giorgio Giacinto 2011
13
Interrogazioni nidificate correlate
!  Le condizioni in una interrogazione interna fa
riferimento ad attributi di relazioni esterne
!  A livello concettuale possono essere pensate
come cicli for annidati
!  L’interrogazione più interna viene valutata per
ogni tupla della interrogazione più esterna
!  Una interrogazione annidata con operatori di
confronto = o IN è sempre formulabile senza
annidamento.
Giorgio Giacinto 2011
14
Funzioni EXISTS e UNIQUE!
!  EXISTS
!  Verifica se il risultato di una interrogazione
annidata è vuoto oppure no
!  EXISTS e NOT EXISTS !
!  Di solito usati con interrogazioni annidate
correlate
!  UNIQUE(Q)!
!  Restituisce TRUE se non ci sono tuple duplicate
nel risultato dell’interrogazione Q
Giorgio Giacinto 2011
15
Interrogazione 16 rivista $
!  Riformulazione+con+EXISTS!
!SELECT E.fname, E.lname!
!FROM employee E!
!WHERE EXISTS (SELECT *!
!
!
!
FROM dependent D!
!
!
!
WHERE E.ssn = D.essn AND!
!
!
!
!
!
!
!
!E.fname = D.dependent_name)!
E.sex = D.sex AND !!
Giorgio Giacinto 2011
16
Interrogazione$6$
!  Mostrare+i+nomi+dei+dipenden7+che+non+hanno+
persone+a+carico+
+SELECT
Giorgio Giacinto 2011
!fname, lname!
!FROM
!employee!
!WHERE
!NOT EXISTS !(SELECT *!
!
!
!
!
!FROM !dependent!
!
!
!
!
!WHERE ssn = essn)!
17
Interrogazione$7$
!  Elencare+i+nomi+dei+dipenden7,+dirigen7+di+dipar7mento,+
che+hanno+almeno+una+persona+a+carico.+
+SELECT !fname, lname!
!FROM
!WHERE
! !
! !
! !
! !
! !
! !
!employee!
!EXISTS (SELECT *!
!
! FROM dependant!
!
! WHERE ssn = essn)!
!AND!
!EXISTS (SELECT *!
!
!
FROM department!
!
!
WHERE ssn = mgrssn)!
Giorgio Giacinto 2011
18
Interrogazione$3$
!  Mostrare+il+nome+di+ogni+dipendente+che+lavora+su+tu#+i+
progeH+controlla7+dal+dipar7mento+1+
+SELECT fname, lname!
!FROM
employee!
!WHERE NOT EXISTS !
! !
!((SELECT pnumber!
! !
! FROM project!
! !
! WHERE dnum = 1)!
! EXCEPT (SELECT pno!
! !
!
!
FROM works_on!
! !
!
!
WHERE essn = ssn))!
Giorgio Giacinto 2011
19
Interrogazione$3
formulazione$alternativa$
SELECT fname, lname!
FROM
employee!
WHERE NOT EXISTS !
! ! (SELECT *!
! !
FROM project!
! !
WHERE dnum = 1 !
! !
!
AND NOT EXISTS!
! !
!
!(SELECT *!
! !
!
! FROM works_on!
! !
!
! WHERE essn = ssn!
! !
!
!
!AND pno = pnumber))!
Giorgio Giacinto 2011
20
Insiemi espliciti di valori
nella clausola WHERE
!  Mostrare+i+numeri+di+SSN+di+tuH+i+dipenden7+che+
lavorano+sui+progeH+1,+2+o+3+
+SELECT !DISTINCT essn!
!FROM
!works_on!
!WHERE !pno IN (1,2,3)!
Giorgio Giacinto 2011
21
Ridenominazione$degli$attributi$
!  Si possono ridenominare gli attributi nel
risultato usando la parola chiave AS
!  Trovare il cognome di ciascun impiegato e del
suo supervisore
Giorgio Giacinto 2011
22
Join$in$SQL$
Giorgio Giacinto 2011
!
23
Join
!  Nella clausola FROM è possibile specificare
una tabella risultante dal collegamento (join) di
due tabelle
!  Nella clausola WHERE compaiono solo le
condizioni di selezione e non quelle di join
!  Mostrare nome, cognome e indirizzo degli
impiegati che lavorano nel dipartimento
‘Ricerca’
Giorgio Giacinto 2011
24
Join naturali
!  NATURAL JOIN su due relazioni R e S
!  Non vengono specificate condizioni di join
!  Condizione implicita di EQUIJOIN per ciascuna
coppia di attributi con lo stesso nome in R e S
SELECT!fname, lname, address!
!FROM !(employee NATURAL JOIN!
!
!(department AS
dept(dname,dno,mgrssn,mgrstartdate)))!
!WHERE dname = ‘Ricerca’!
Giorgio Giacinto 2011
25
Join esterni
!  Join interno
!  È la modalità predefinita di join
!  Una tupla compare nel risultato solo se esiste
una tupla collegata nell’altra relazione
!  Join esterni
!  Nel risultato compaiono tutte le tuple di una o di
entrambe le relazioni
!  Nel caso di assenza di tuple corrispondenti, gli
attributi con valori non definiti sono riempiti con
NULL
Giorgio Giacinto 2011
26
Left Join, Right Join, Full Join
!  LEFT OUTER JOIN
!  Nel risultato compaiono tutte le tuple della
tabella a sinistra dell’operatore di join
!  RIGHT OUTER JOIN
!  Nel risultato compaiono tutte le tuple della
tabella a destra dell’operatore di join
!  FULL OUTER JOIN
!  Nel risultato compaiono tutte le tuple delle
relazioni coinvolte nel join
Giorgio Giacinto 2011
27
Interrogazione$8$con$join$esterno$$
!  Mostrare+il+cognome+di+tuH+gli+impiega7+e+dei+loro+
supervisori,+se+esistono+
+SELECT !e.lname AS employee,!
! !
!s.lname AS supervisor!
!FROM
! !
!employee e LEFT OUTER JOIN
!employee S!
! !
!ON e.superssn = s.ssn!
Giorgio Giacinto 2011
28
Funzioni$di$aggregazione$
Giorgio Giacinto 2011
!
29
Funzioni di aggregazione
!  Funzioni di Aggregazione
!  Forniscono in unica tupla di sintesi le
informazioni provenienti da tuple multiple
!  Possono essere usate nella clausola SELECT o
nella clausola HAVING!
!  Esempio: COUNT, SUM, MAX, MIN, and AVG!
!  I valori NULL sono scartati
!  Raggruppamento
!  Crea sottogruppi di tuple prima di creare la
sintesi
Giorgio Giacinto 2011
30
Interrogazione$20
!  Calcolare la somma degli stipendi percepiti
dagli impiegati che lavorano nel dipartimento
‘Ricerca’. Mostrare anche lo stipendio
massimo, lo stipendio minimo e il valore medio
degli stipendi per quel dipartimento.
Giorgio Giacinto 2011
31
Interrogazioni$21$e$22$
!  Calcolare+il+numero+totale+di+impiega7+della+società+
!  Calcolare+il+numero+di+dipenden7+del+dipar7mento+
‘Ricerca’+
Giorgio Giacinto 2011
32
Interrogazione$23$
!  Calcolare+il+numero+dei+valori+dis7n7+degli+s7pendi+
presen7+nella+base+di+da7+
+SELECT !COUNT(DISTINCT salary)!
!FROM employee;!
Giorgio Giacinto 2011
33
Interrogazione$5$
!  Trovare+i+nomi+di+tuH+gli+impiega7+che+hanno+due+o+
più+persone+a+carico+
+SELECT fname,lname!
!FROM !employee!
!WHERE !(SELECT !COUNT(*)!
!
!!FROM !dependant!
!
!!WHERE !ssn = essn) >= 2;!
Giorgio Giacinto 2011
34
Raggruppamento
!  Partiziona le relazioni in sottoinsiemi di tuple
!  Raggruppamento in base ai valori di uno o più
attributi (attributi di raggruppamento)
!  Si applica una funzione di aggregazione su ogni
partizione separatamente
!  Clausola GROUP BY
!  seguito dagli attributi di raggruppamento
!  Se negli attributi di raggruppamento è presente
NULL
!  Si crea un gruppo separato per il valore NULL
Giorgio Giacinto 2011
35
Interrogazione$24$
!  Per+ciascun+dipar7mento+si+mostrino+il+numero+del+
dipar7mento,+il+numero+degli+impiega7+nel+
dipar7mento+e+il+loro+s7pendio+medio+
SELECT !dno, COUNT(*),AVG(salary)!
FROM
!employee!
GROUP BY!dno!
Giorgio Giacinto 2011
36
Risultato$Interrogazione$24$$
Giorgio Giacinto 2011
37
Interrogazione$25$
!  Per+ciascun+progeIo+si+mostrino+il+numero+del+
progeIo+,+il+nome+del+progeIo+e+il+numero+di+
impiega7+che+vi+lavorano+
SELECT !pnumber,pname,COUNT(*)!
FROM
!project,works_on!
WHERE !pnumber = pno!
GROUP BY!pnumber,pname!
!
!  Nella+clausola+GROUP+BY+devono+comparire+tuH+gli+
aIribu7+presen7+nella+clausola+SELECT!
Giorgio Giacinto 2011
38
Clausola HAVING!
!  Consente+di+specificare+una+condizione+su+un+
gruppo+
I26+Per+ciascun+progeIo+in+cui+lavorano+più+di+due+
impiega7,+mostrare+il+numero+del+progeIo+,+il+nome+
del+progeIo+e+il+numero+di+impiega7+che+vi+lavorano+
SELECT !pnumber,pname,COUNT(*)!
FROM
!project,works_on!
WHERE !pnumber = pno!
GROUP BY!pnumber,pname!
HAVING !COUNT(*) > 2+
Giorgio Giacinto 2011
39
Risultato$Interrogazione$26$
Giorgio Giacinto 2011
40
Interrogazione$27$
!  Per+ciascun+progeIo+si+mostri+il+numero+del+
progeIo,+il+nome+dl+progeIo+e+il+numero+degli+
impiega7+del+dipar7mento+5+che+vi+prendono+parte+
SELECT !pnumber,pname,COUNT(*)!
FROM
!project,works_on,employee!
WHERE !pnumber = pno AND essn = ssn!
!
!AND dno = 5!
GROUP BY!pnumber,pname!
+
Giorgio Giacinto 2011
41
Interrogazione$28$
!  Per+ogni+dipar7mento+che+ha+più+di+5+impiega7+si+
mostrino+il+numero+del+dipar7mento+e+il+numero+di+
dipenden7+che+guadagnano+più+di+40.000+dollari+
SELECT !dnumber, COUNT(*)!
FROM
!department,employee!
WHERE
!dnumber = dno AND!
!
!salary > 40000!
GROUP BY!dnumber!
HAVING !COUNT(*) > 5!
!  formulazione+errata+
!  Il+dipar7mento+deve+avere+almeno+5+dipenden7+
indipendentemente+dallo+s7pendio +
+
Giorgio Giacinto 2011
42
Interrogazione$28$
!  Per+ogni+dipar7mento+che+ha+più+di+5+impiega7+si+
mostrino+il+numero+del+dipar7mento+e+il+numero+di+
dipenden7+che+guadagnano+più+di+40.000+dollari+
SELECT !dnumber, COUNT(*)!
FROM
!department,employee!
WHERE
!dnumber = dno AND!
!
!salary > 40000 AND dno IN!
!
!
!(SELECT
!dno!
!
!
! FROM!
!employee!
!
!
! GROUP BY !dno!
!
!
! HAVING
!COUNT(*) > 5)!
GROUP BY!dnumber!
Giorgio Giacinto 2011
43
Riepilogando…$
Giorgio Giacinto 2011
44
Asserzioni$e$trigger$
Giorgio Giacinto 2011
!
45
Definzione di: Vincoli come Asserzioni
Azioni come Trigger
!  CREATE ASSERTION!
!  Permette di definire vincoli non esprimibili
tramite I vincoli del modello relazionale
!  CREATE TRIGGER!
!  Permette di definire azioni eseguite in
automatico dal DBMS al verificarsi di
determinati eventi o condizioni
Giorgio Giacinto 2011
46
Asserzioni per definire vincoli generici
!  CREATE ASSERTION !
!  Clausola CHECK!
!  Condizione spesso espressa con
!  EXISTS o NOT EXISTS!
!  una interrogazione che individua le tuple che
violano il vincolo
!  Le operazioni che violano il vincolo sono
rifiutate
!  Utilizzato solo se il vincolo non si può
esprimere nella definizione di attributi e domini
Giorgio Giacinto 2011
47
Esempio$di$asserzione$
!  Lo+s7pendio+di+un+impiegato+non+deve+essere+
superiore+a+quello+del+direIore+del+dipar7mento+
dove+lavora+
Giorgio Giacinto 2011
48
Trigger
!  CREATE TRIGGER!
!  Utilizzato per tenere sotto controllo i dati nella
base di dati
!  Ad es., un direttore può essere avvisato per
spese superiori ad una certa soglia
!  Definizione di un trigger
!  Evento(i)
!  Condizione
!  Azione
Giorgio Giacinto 2011
49
Esempio$di$trigger$
!  No7ficare+se+lo+s7pendio+di+un+impiegato+è+superiore+a+quello+
del+suo+direIo+supervisore+
CREATE TRIGGER !violazione_stipendio!
BEFORE INSERT OR UPDATE OF
stipendio,super_ssn!
ON!
!
!impiegato!
FOR EACH ROW!
WHEN (NEW.stipendio > !
!
!
!(SELECT stipendio!
!
!
! FROM impiegato!
!
!
! WHERE ssn = NEW.super_ssn))!
INFORMA_SUPERVISORE(NEW.super_ssn,ssn)!
Giorgio Giacinto 2011
50
Viste$
Giorgio Giacinto 2011
!
51
Vista
!  È una tabella virtuale
!  derivata da altre tabelle (di definizione)
!  risultato di una interrogazione
!  su tabelle memorizzate o viste
!  sempre aggiornata dal DBMS
!  CREATE VIEW!
!  Crea una vista sulla base di una interrogazione
!  DROP VIEW
!  Elimina la definizione di una vista!
Giorgio Giacinto 2011
52
Esempi
Giorgio Giacinto 2011
53
Implementazione delle viste
!  Strategie del DBMS per eseguire le
interrogazioni che coinvolgono viste
!  Approccio basato sulla modifica al momento
della interrogazione
!  Si trasforma l’interrogazione sulla vista in una
interrogazione sulle tabelle di base
!  Inefficiente in caso di viste definite con
interrogazioni onerose computazionalmente
Giorgio Giacinto 2011
54
Implementazione delle viste
!  Approccio basato sulla materializzazione delle
viste
!  Il DBMS memorizza la vista come tabella
temporanea la prima volta che viene usata in
una interrogazione
!  ipotesi: altre interrogazioni useranno la vista
!  Aggiornamenti efficienti della vista in
conseguenza di aggiornamenti nelle tabelle di
base
!  strategie di aggiornamento incrementale
Giorgio Giacinto 2011
55
Aggiornamento delle viste
!  È possibile aggiornare solo viste definite su una
sola tabella di base senza funzioni di aggregazione
!  L’aggiornamento si ripercuote in modo definito sulle
tabelle si base
!  L’aggiornamento di viste che prevedono il join fra
più tabelle non sempre possibile
!  Il DBMS ha difficoltà a stabilire l’effetto sulle tabelle
di base
!  Clausola WITH CHECK OPTION
!  Da inserire alla fine delle definizione di una vista per
poter effettuare aggiornamenti
Giorgio Giacinto 2011
56
Definizione di viste in-linea
!  Definite nella clausola FROM di una
interrogazione
Giorgio Giacinto 2011
57
Modifiche$dello$schema$
!
Giorgio Giacinto 2011
58
Comandi per modifcare lo schema
!  Permettono l’evoluzione dello schema
!  Modifiche effettuate durante il normale esercizio
del DBMS
!  Non richiede la ricompilazione dello schema
Giorgio Giacinto 2011
59
Comando DROP!
!  Comando DROP
!  Usato per eliminare qualunque elemento dello
schema identificato da un nome come tabelle,
domini, vincoli
!  Opzioni
!  CASCADE e RESTRICT!
!  Esempio
!  DROP SCHEMA COMPANY CASCADE;!
Giorgio Giacinto 2011
60
Comando ALTER!
!  Aggiunta e eliminazione di colonne (attributi)
!  Modifiche nella definizione delle colonne
!  Aggiunta e eliminazione di vincoli di tabella
!  Esempio
!  ALTER TABLE COMPANY.EMPLOYEE ADD
COLUMN Job VARCHAR(12);!
!  Eliminazione di colonne
!  CASCADE o RESTRICT!
Giorgio Giacinto 2011