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