Corso Di  Basi Di  Dati 02  S Q L  D M L
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
923
On Slideshare
922
From Embeds
1
Number of Embeds
1

Actions

Shares
Downloads
19
Comments
0
Likes
0

Embeds 1

http://www.slideshare.net 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Corso di Basi di Dati e Laboratorio LINGUAGGIO SQL INTERROGAZIONI Prof. Silvana Castano A.A. 2005/2006 Basi di Dati e Laboratorio 1 SQL • Dichiarativo (non procedurale) Descrizione dell’obiettivo dell’operazione. • Interprete SQL del DBMS che analizza l’istruzione e formula una interrogazione equivalente nel linguaggio procedurale interno (nascosto all’utente). • Incorporabile in un programma in linguaggio ospite Compilazione di interrogazioni. A.A. 2005/2006 Basi di Dati e Laboratorio 2 SQL • Traduzione ed ottimizzazione query optimizer. • Diretto ad una vasta gamma di utenti : – utenti che interagiscono con l’interprete. – programmatori di applicazioni. A.A. 2005/2006 Basi di Dati e Laboratorio 3
  • 2. ISTRUZIONE SELECT SELECT Lista Attributi FROM Lista Tabelle [WHERE Condizione] • SELECT: nomi di attributo degli attributi target i cui valori devono essere reperiti con la query • FROM: nomi di relazioni su cui la query deve essere valutata • WHERE: espressione (booleana) di ricerca che identifica le ennuple che dovranno far parte del risultato della query A.A. 2005/2006 Basi di Dati e Laboratorio 4 ESEMPIO Impiegato ID Nome Cognome Ufficio Stipendio DipN 10 John Smith 20 45 Adm 20 Franklin Wong 20 36 Prod 30 Alicia Zelaya 10 70 Adm 40 Jennifer Wallace 15 45 HQ 50 Ramesh Smith 30 80 HQ 60 Joyce English 7 73 Prod 70 James Borg 5 40 Adm 80 Ahmad Ramesh 20 46 Prod A.A. 2005/2006 Basi di Dati e Laboratorio 5 ESEMPIO Dipartimento Nome Indirizzo Direttore Adm 731 Fondre, Huston, TX 30 HQ 980, Dallas, Huston, TX 50 Prod 975, Berry, Bellaire, TX 60 R&D 980, Dallas, Huston, TX NULL A.A. 2005/2006 Basi di Dati e Laboratorio 6
  • 3. CLAUSOLA WHERE • Argomento: espressioni booleane costruite combinando predicati semplici mediante operatori logici AND, OR, NOT • Uso di operatori di confronto (=, <>, <, >, <=, >=) fra espressione a sx costruita a partire dai valori degli attributi per la riga e un valore costante o un’altra espressione a dx • AND: selezione delle righe che rendono veri tutti i predicati • OR: selezione delle righe per cui almeno un predicato è vero • NOT: unario, inverte il valore di verità del predicato A.A. 2005/2006 Basi di Dati e Laboratorio 7 CLAUSOLA WHERE Altri operatori in WHERE • [ not ] BETWEEN a AND b • [ not ] IN (lista valori) • IS [ not ] NULL • [ not ] LIKE ‘pattern’ • [NOT] EXISTS A.A. 2005/2006 Basi di Dati e Laboratorio 8 ESEMPI Reperire ufficio e stipendio dell’ impiegato (o degli impegati) il cui nome è ‘John Smith’ SELECT Ufficio, Stipendio FROM Impiegato WHERE Cognome = ‘Smith’ AND Nome = ‘John’ Ufficio Stipendio 20 45 Π Ufficio, Stipendio(σ Cognome=‘Smith’AND Nome=‘John’(Impiegato)) A.A. 2005/2006 Basi di Dati e Laboratorio 9
  • 4. PATTERN MATCHING DI STRINGHE [NOT] LIKE pattern Nella specifica del pattern: • _ rappresenta un carattere arbitrario • % rappresenta una stringa di lunghezza arbitraria (anche 0 caratteri) A.A. 2005/2006 Basi di Dati e Laboratorio 10 ESEMPIO Reperire tutti i dati dei dipartimenti il cui indirizzo è a Houston in Texas SELECT * FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ Nome Indirizzo Direttore Amm.ne 731 Fondre, Houston, 30 TX Sede 980, Dallas, Houston, 50 TX Ricerca 980, Dallas, Houston, NULL TX A.A. 2005/2006 Basi di Dati e Laboratorio 11 RIDENOMINAZIONE ATTRIBUTI Per gli impiegati del dipartimento Amministrazione, mostrare nome, cognome e stipendio risultante applicando un aumento del 10% SELECT Nome, Cognome, Stipendio*1.1 AS NuovoStipendio FROM Impiegato WHERE DipN=‘Adm’ Nome Cognome NuovoStipendio John Smith 49,5 Alicia Zelaya 77 James Borg 44 A.A. 2005/2006 Basi di Dati e Laboratorio 12
  • 5. JOIN Reperire nomi, cognomi e indirizzo di lavoro degli impiegati • Dati su Nome e Cognome degli impiegati si trovano nella tabella Impiegato. • L’indirizzo di lavoro si trova nella tabella Dipartimento. A.A. 2005/2006 Basi di Dati e Laboratorio 13 ESEMPIO • Le tuple di Impiegato sono collegate alle tuple di Dipartimento mediante chiave esterna (attributo DipN) • Per ricostruire l’informazione cercata, ogni tupla di impegato va concatenata con la tupla del corrispondente dipartimento • La condizione da imporre è l’uguaglianza dei valori di chiave esterna di Dipartimento e corrispondente chiave primaria di Impiegato (equijoin) SELECT Impiegato.Nome, Impiegato.Cognome, Dipartimento.Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN=Dipartimento.Nome A.A. 2005/2006 Basi di Dati e Laboratorio 14 JOIN • Tutte le tabelle coinvolte nel JOIN sono esplicitate nella clausola FROM • Sul prodotto cartesiano di tali tabelle si applicano le condizioni specificate in WHERE • Le condizioni del JOIN sono scritte in modo esplicito nella WHERE (uso dei valori di chiave esterna per collegare tuple di tabelle diverse e combinare i loro dati nel risultato) A.A. 2005/2006 Basi di Dati e Laboratorio 15
  • 6. INTERPRETAZIONE ALGEBRICA SELECT Impiegato.Nome,Cognome, Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN=Dipartimento.Nome Π Impiegato.Nome,Cognome, Indirizzo (σDipN=Dipartimento.Nome(Impiegato X Dipartimento)) A.A. 2005/2006 Basi di Dati e Laboratorio 16 ASSENZA CLAUSOLA WHERE SELECT * FROM Impiegato, Dipartimento Questa interrogazione specifica il prodotto cartesiano delle due relazioni A.A. 2005/2006 Basi di Dati e Laboratorio 17 JOIN Reperire nomi, cognomi e indirizzo di lavoro degli impiegati dell’amministrazione SELECT Impiegato.Nome, Impiegato.Cognome, Dipartimento.Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN=Dipartimento.Nome AND Dipartimento.Nome=‘Adm’ Condizione di join Condizione di selezione A.A. 2005/2006 Basi di Dati e Laboratorio 18
  • 7. USO DI ALIAS Trovare cognome, nome e ufficio degli impiegati che lavorano nello stesso ufficio di impiegati di nome Smith Al fine di stabilire se un impiegato appartiene o meno al risultato occorre poter confrontare tuple di Impiegato con se stesse Uso di alias di relazione A.A. 2005/2006 Basi di Dati e Laboratorio 19 USO DI ALIAS Trovare cognome, nome e ufficio degli impiegati che lavorano nello stesso ufficio di impiegati di nome Smith SELECT Imp.Cognome, Imp.Nome, Imp.Ufficio FROM Impiegato AS Imp, Impiegato AS Smith WHERE Imp.Ufficio = Smith.Ufficio AND Smith.Cognome = ‘Smith’ AND Imp.ID <> Smith.ID Alias di relazione: • Imp rappresenta gli impiegati • Smith rappresenta gli impiegati di nome Smith A.A. 2005/2006 Basi di Dati e Laboratorio 20 VALORI NULLI • Introduzione di condizioni atomiche per verificare se un valore è specificato oppure è nullo • Predicato is null: selezione delle righe con valori nulli Attributo is [not] null • Il predicato risulta vero se l’attributo ha valore nullo (is not null è la sua negazione) A.A. 2005/2006 Basi di Dati e Laboratorio 21
  • 8. ELIMINAZIONE DUPLICATI Possibile presenza di righe uguali all’interno di una tabella risultato di una interrogazione. Eliminazione dei duplicati a carico dell’utente: SELECT DISTINCT A.A. 2005/2006 Basi di Dati e Laboratorio 22 ELIMINAZIONE DUPLICATI Reperire gli indirizzi dei dipartimenti di Houston in Texas SELECT Indirizzo FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ Indirizzo 731 Fondre, Houston, TX 980, Dallas, Houston, TX 980, Dallas, Houston, TX A.A. 2005/2006 Basi di Dati e Laboratorio 23 ELIMINAZIONE DUPLICATI Reperire gli indirizzi dei dipartimenti di Houston in Texas (senza duplicati) SELECT DISTINCT Indirizzo FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ Indirizzo 731 Fondre, Houston, TX 980, Dallas, Houston, TX A.A. 2005/2006 Basi di Dati e Laboratorio 24
  • 9. ORDINAMENTO DEL RISULTATO • Ordinamento delle ennuple risultato secondo uno o più attributi specificati ORDER BY Attributo [ASC | DESC] {, Attributo [ASC | DESC]} (default ASC) A.A. 2005/2006 Basi di Dati e Laboratorio 25 ESEMPIO SELECT * FROM Impiegato ORDER BY Cognome, Stipendio DESC ID Nome Cognome Ufficio Stipendio DipN 70 James Borg 75 40 Adm 60 Joyce English 7 73 Prod 80 Ahmad Ramesh 20 46 Prod 50 Ramesh Smith 14 80 HQ 10 John Smith 10 45 Adm 40 Jennifer Wallace 16 45 HQ 20 Franklin Wong 20 36 Prod 30 Alicia Zelaya 20 70 Adm A.A. 2005/2006 Basi di Dati e Laboratorio 26 JOIN INTERNI ED ESTERNI • Sintassi per la specifica di join introdotta in SQL-2 che permette di distinguere le condizioni di join dalle altre condizioni • Le condizioni di join appaiono nella clausola FROM associate alle tabelle che partecipano al join • Tipi di join • (INNER) JOIN (interno, default coincide con il theta-join) • NATURAL JOIN (join naturale) • RIGHT, LEFT, FULL OUTER JOIN (join esterni) A.A. 2005/2006 Basi di Dati e Laboratorio 27
  • 10. INNER JOIN SELECT Impiegato.Nome, Impiegato.Cognome Dipartimento.Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN = Dipartimento.Nome SELECT Impiegato.Nome, Impiegato.Cognome Dipartimento.Indirizzo FROM Impiegato INNER JOIN Dipartimento ON Impiegato.DipN = Dipartimento.Nome A.A. 2005/2006 Basi di Dati e Laboratorio 28 JOIN Reperire nomi, cognomi e indirizzo di lavoro degli impiegati dell’amministrazione SELECT Impiegato.Nome, Impiegato.Cognome, Dipartimento.Indirizzo FROM Impiegato INNER JOIN Dipartimento ON Impiegato.DipN = Dipartimento.Nome WHERE Dipartimento.Nome=‘Adm’ A.A. 2005/2006 Basi di Dati e Laboratorio 29 NATURAL JOIN • Nell’operazione NATURAL JOIN di due relazioni non viene specificata alcuna condizione di join. • Viene applicata una condizione implicita di equijoin per ciascuna coppia di attributi con lo stesso nome nelle due relazioni. • Ogni coppia di attributi di questo tipo è inclusa una sola volta nel risultato • Se i nomi degli attributi non sono gli stessi nelle due relazioni, si possono ridenominare per farli corrispondere e poi applicare NATURAL JOIN A.A. 2005/2006 Basi di Dati e Laboratorio 30
  • 11. JOIN ESTERNI • JOIN ESTERNO (OUTER JOIN) Esegue un join mantenendo nel risultato tutte le righe che fanno parte di una o di entrambe le relazioni coinvolte • LEFT (OUTER) JOIN Fornisce come risultato il join interno esteso con le tuple della relazione che compare a sinistra del join per le quali non esiste una corrispondente tupla nella relazione di destra A.A. 2005/2006 Basi di Dati e Laboratorio 31 JOIN ESTERNI RIGHT (OUTER) JOIN Fornisce come risultato il join interno esteso con le tuple della relazione che compare a destra del join per le quali non esiste una corrispondente tupla nella relazione di sinistra FULL (OUTER) JOIN Fornisce come risultato il join interno esteso con le tuple di ciascuna relazione per le quali non esiste una corrispondente tupla dall’altra parte A.A. 2005/2006 Basi di Dati e Laboratorio 32 ESEMPIO SELECT D.Nome,Indirizzo, I.Nome AS NomeDir, I.Cognome AS CognomeDir, FROM Dipartimento AS D LEFT JOIN Impiegato AS I ON D.Direttore = I.ID D.Nome Indirizzo NomeDir CognomeDir Adm 731 Fondre, Huston, TX Alicia Zelaya HQ 980, Dallas, Huston, TX Ramesh Smith Prod 975, Berry, Bellaire, TX Joyce English R&D 980, Dallas, Huston, TX NULL NULL A.A. 2005/2006 Basi di Dati e Laboratorio 33
  • 12. OPERATORI AGGREGATI • SQL mette a disposizione un insieme di operatori aggregati per derivare valori aggregati a partire da insiemi di tuple di relazioni. Ad esempio, il numero totale di impiegati del dipartimento Produzione non è una proprietà di una singola tupla ma può essere calcolato attraverso il conteggio del nr. di tuple di Impiegato relative agli impiegati di produzione A.A. 2005/2006 Basi di Dati e Laboratorio 34 OPERATORI AGGREGATI • Principali operatori aggregati built-in dell’SQL • COUNT • SUM • MAX • MIN • AVG • Prima si esegue l’interrogazione considerando le clausole FROM e WHERE della query • L’operatore aggregato viene applicato al risultato ottenuto A.A. 2005/2006 Basi di Dati e Laboratorio 35 OPERATORI AGGREGATI • COUNT(*): restituisce il numero di righe di una relazione • COUNT ALL ListaAttributi: restituisce il numero di righe della relazione che possiedono valori diversi da NULL per gli attributi specificati • COUNT DISTINCT ListaAttributi: restituisce il numero di valori diversi all’interno della relazione per gli attributi specificati A.A. 2005/2006 Basi di Dati e Laboratorio 36
  • 13. OPERATORI AGGREGATI SELECT COUNT ( DISTINCT Stipendio ) FROM Impiegato • Restituisce il nr. di valori diversi dell’attributo Stipendio nella tabella Impiegato SELECT COUNT (*) FROM Impiegato WHERE DipN = ‘Prod’ • Restituisce il Nr. di impiegati del dipartimento Produzione A.A. 2005/2006 Basi di Dati e Laboratorio 37 OPERATORI AGGREGATI Determinare il massimo, il minimo e la media degli stipendi degli impiegati SELECT MAX(Stipendio), MIN(Stipendio), AVG(Stipendio) FROM Impiegato Determinare la somma degli stipendi del dipartimento Amministrazione SELECT SUM (Stipendio) FROM Impiegato WHERE DipN = ‘Adm’ A.A. 2005/2006 Basi di Dati e Laboratorio 38 OPERATORI AGGREGATI Determinare lo stipendio massimo tra quelli degli impiegati che lavorano in un dipartimento di Houston in Texas SELECT MAX ( Stipendio ) FROM Impiegato, Dipartimento WHERE Impiegato.DipN = Dipartimento.Nome AND Indirizzo LIKE ‘%Houston%TX%’ A.A. 2005/2006 Basi di Dati e Laboratorio 39
  • 14. RAGGRUPPAMENTI • Necessità di applicare operatori aggregati a sottogruppi di tuple di una relazione in base al valore di uno o più attributi • Clausola GROUP BY ListaAttributi per eseguire il raggruppamento • Prima si effettua il raggruppamento e poi si applica l’operatore aggregato a ciascun sottogruppo individuato A.A. 2005/2006 Basi di Dati e Laboratorio 40 RAGGRUPPAMENTI Determinare, per ciascun dipartimento, il numero di impiegati e la somma dei loro stipendi. SELECT DipN, COUNT(*) AS TOTImpiegati, SUM (Stipendio) AS TOTStipendio FROM Impiegato GROUP BY DipN DipN TOTImpiegati TOTStipendio Adm 3 155 Prod 3 155 HQ 2 125 A.A. 2005/2006 Basi di Dati e Laboratorio 41 RAGGRUPPAMENTI • Esigenza di applicare gli operatori aggregati solo su raggruppamenti che verificano a condizioni date • Clausola HAVING che specifica una condizione su un gruppo di tuple associata al valore degli attributi di raggruppamento • Solo i raggruppamenti che soddisfano la condizione specificata nella clausola HAVING sono inclusi nel risultato dell’interrogazione A.A. 2005/2006 Basi di Dati e Laboratorio 42
  • 15. PREDICATI SUI RAGGRUPPAMENTI Determinare i dipartimenti che spendono più di 130 KE in stipendi. SELECT DipN, SUM (Stipendio) FROM Impiegato GROUP BY DipN HAVING SUM (Stipendio) > 130 A.A. 2005/2006 Basi di Dati e Laboratorio 43 PREDICATI SUI RAGGRUPPAMENTI Per i dipartimenti in cui lavorano almeno 2 impiegati con stipendio superiore a 40 KE, mostrare il nome del dipartimento e il nr. totale di impiegati. SELECT DipN, COUNT(*) FROM Impiegato WHERE Stipendio > 40 GROUP BY DipN HAVING COUNT(*) >= 2 A.A. 2005/2006 Basi di Dati e Laboratorio 44 INTERROGAZIONI DI TIPO INSIEMISTICO • Le operazioni insiemistiche UNION, INTERSECT, EXCEPT sono state incorporate direttamente in SQL • Default: eliminazione dei duplicati • ALL: mantenimento dei duplicati nel risultato A.A. 2005/2006 Basi di Dati e Laboratorio 45
  • 16. INTERROGAZIONI DI TIPO INSIEMISTICO • UNION: arricchisce la potenza espressiva di SQL e permette di scrivere interrogazioni altrimenti non formulabili. • Interrogazioni con INTERSECT e EXCEPT possono essere espresse utilizzando altri costrutti del linguaggio (v. interrogazioni nidificate). A.A. 2005/2006 Basi di Dati e Laboratorio 46 INTERROGAZIONI DI TIPO INSIEMISTICO Determinare l’insieme dei nomi e dei cognomi degli impiegati SELECT Nome FROM Impiegato UNION SELECT Cognome FROM Impiegato UNION ALL preserva i duplicati (quindi la stringa Ramesh Appare 2 volte in quanto sia nome che cognome) A.A. 2005/2006 Basi di Dati e Laboratorio 47 INTERROGAZIONI DI TIPO INSIEMISTICO Trovare i cognomi degli impiegati che sono anche nomi. SELECT Nome FROM Impiegato Nome INTERSECT Ramesh SELECT Cognome FROM Impiegato A.A. 2005/2006 Basi di Dati e Laboratorio 48
  • 17. INTERROGAZIONI DI TIPO INSIEMISTICO Trovare i codici degli impiegati che non sono direttori SELECT ID FROM Impiegato EXCEPT SELECT Direttore FROM Dipartimento A.A. 2005/2006 Basi di Dati e Laboratorio 49 INTERROGAZIONI NIDIFICATE Argomento della WHERE è un predicato in cui si confronta un valore (risultato di una espressione valutata su una singola riga) con il risultato dell’esecuzione di una query SQL interna • Operatori ALL, ANY Per estendere i normali operatori di confronto (=,<>,>,<,>=,<=) al problema di confrontare un singolo valore con l’insieme dei valori risultato della query interna. A.A. 2005/2006 Basi di Dati e Laboratorio 50 INTERROGAZIONI NIDIFICATE Trovare i nomi e cognomi degli impiegati che lavorano a Houston in Texas SELECT Impiegato.Nome, Impiegato.Cognome FROM Impiegato, Dipartimento WHERE Impiegato.DipN = Dipartimento.Nome AND Indirizzo LIKE ‘%Houston%TX%’ A.A. 2005/2006 Basi di Dati e Laboratorio 51
  • 18. INTERROGAZIONI NIDIFICATE La stessa interrogazione si può esprimere in forma nidificata SELECT Nome, Cognome FROM Impiegato WHERE DipN = ANY (SELECT Nome FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ ) N.B. Operatori IN e NOT IN per testare l’appartenenza ad e l’esclusione da un insieme (identici a ‘= ANY’ e ‘<> ALL’) A.A. 2005/2006 Basi di Dati e Laboratorio 52 INTERROGAZIONI NIDIFICATE Trovare nomi e cognomi degli impiegati che lavorano nello stesso ufficio di qualche impiegato del dipartimento Produzione SELECT Nome, Cognome FROM Impiegato WHERE Ufficio IN ( SELECT Ufficio FROM Impiegato WHERE DipN = ‘Prod’) A.A. 2005/2006 Basi di Dati e Laboratorio 53 INTERROGAZIONI NIDIFICATE Si può esprimere anche attraverso le variabili. SELECT DISTINCT Imp.Nome, Imp.Cognome FROM Impiegato AS Imp, Impiegato AS Prod WHERE Imp.Ufficio = Prod.Ufficio AND Prod.DipN = ‘Prod’ A.A. 2005/2006 Basi di Dati e Laboratorio 54
  • 19. INTERROGAZIONI NIDIFICATE Trovare i dipartimenti dove non lavorano persone di nome Smith SELECT Nome FROM Dipartimento WHERE Nome NOT IN ( SELECT DipN FROM Impiegato WHERE Cognome = ‘Smith’) A.A. 2005/2006 Basi di Dati e Laboratorio 55 INTERROGAZIONI NIDIFICATE Non si può esprimere mediante join; uso dell’operatore insiemistico differenza. SELECT Nome FROM Dipartimento EXCEPT SELECT DipN FROM Impiegato WHERE Cognome = ‘Smith’ In algebra relazionale: Π Nome(Dipartimento) - Π DipN (σCognome=‘Smith’(Impiegato)) A.A. 2005/2006 Basi di Dati e Laboratorio 56 INTERROGAZIONI NIDIFICATE Interrogazioni con MIN e MAX possono essere espresse mediante query nidificate. Trovare i dipartimenti con gli stipendi più elevati SELECT DipN AS NomeDipartimento FROM Impiegato WHERE Stipendio = ( SELECT MAX ( Stipendio ) FROM Impiegato) SELECT DipN AS NomeDipartimento FROM Impiegato WHERE Stipendio >= ALL ( SELECT DISTINCT Stipendio FROM Impiegato) A.A. 2005/2006 Basi di Dati e Laboratorio 57
  • 20. SUBQUERY CORRELATE • Negli esempi visti ogni subquery viene eseguita una sola volta l’ insieme dei valori risultante è usato per la valutazione della clausola WHERE della query esterna. • E’ possibile definire subquery che sono eseguite ripetutamente per ogni tupla candidata considerata nella valutazione della query esterna. A.A. 2005/2006 Basi di Dati e Laboratorio 58 SUBQUERY CORRELATE Determinare gli impiegati che guadagnano più dello stipendio medio del proprio dipartimento • E’ necessaria una query esterna per la selezione degli impiegati dalla relazione Impiegati in base ad un predicato su stipendio; tale query avrà la forma: SELECT Nome, Cognome FROM Impiegato WHERE Stipendio > (media degli stipendi nel dipartimento dell’impiegato candidato) A.A. 2005/2006 Basi di Dati e Laboratorio 59 SUBQUERY CORRELATE La subquery dovrà calcolare la media degli stipendi del dipartimento relativo a ogni tupla candidata della relazione Impiegati; tale subquery avrà la forma: SELECT AVG(Stipendio) FROM Impiegato WHERE DipN = (valore di DipN nella tupla dell’impiegato candidato) A.A. 2005/2006 Basi di Dati e Laboratorio 60
  • 21. SUBQUERY CORRELATE Ogni volta che la query esterna considera una tupla candidata, viene invocata la subquery e viene ‘passato’ il nome del dipartimento dell’impiegato in esame La subquery calcola quindi la media degli stipendi nel dipartimento che e’ stato passato e restituisce tale valore alla query esterna La query esterna può quindi confrontare lo stipendio dell’impiegato in esame con il valore restituito dalla subquery A.A. 2005/2006 Basi di Dati e Laboratorio 61 SUBQUERY CORRELATE Questo tipo di query è chiamato correlato, perché ogni esecuzione della subquery è correlata al valore di uno o più attributi delle tuple candidate nella query esterna Per poter riferire le colonne delle tuple candidate nella query esterna si fa uso degli alias di relazione L’alias di relazione è definito nella query esterna e riferito nella query interna A.A. 2005/2006 Basi di Dati e Laboratorio 62 SUBQUERY CORRELATE Determinare gli impiegati che guadagnano più dello stipendio medio del proprio dipartimento con ordinamento del risultato per dipartimento. SELECT Cognome, Nome, Stipendio, DipN FROM Impiegato X WHERE Stipendio > ( SELECT AVG(Stipendio) FROM Impiegato WHERE X.DipN=DipN) ORDER BY DipN A.A. 2005/2006 Basi di Dati e Laboratorio 63
  • 22. SUBQUERY CORRELATE - EXISTS Il predicato EXISTS(sq) restituisce il valore booleano TRUE se la subquery restituisce almeno un tupla; restituisce il valore booleano FALSE altrimenti Il predicato NOT EXISTS(sq) restituisce il valore booleano TRUE se la subquery non restituisce alcuna tupla; restituisce il valore booleano FALSE altrimenti A.A. 2005/2006 Basi di Dati e Laboratorio 64 INTERROGAZIONI NIDIFICATE Trovare gli impiegati che hanno omonimi SELECT ID, Cognome, Nome FROM Impiegato I1 WHERE EXISTS (SELECT * FROM Impiegato I2 WHERE I1.Nome = I2.Nome AND I1.Cognome = I2.Cognome AND I1.ID <> I2.ID) A.A. 2005/2006 Basi di Dati e Laboratorio 65 DIVISIONE • Le subquery correlate e l’operatore di NOT EXISTS sono particolarmente utili per implementare l’operazione di divisione in SQL • Consideriamo le relazioni: Impiegato(ID, Nome, Cognome) Progetto(Prog#, Pnome, Budget) Partecipazione(ID, Prog#) • Determinare i codici degli impiegati che partecipano a tutti i progetti con un budget maggiore di 50000 Partecipazione ÷ (ΠProg#σBudget>50000(Progetto))) A.A. 2005/2006 Basi di Dati e Laboratorio 66
  • 23. DIVISIONE - ESEMPIO La specifica della divisione in SQL fa uso dell’operatore NOT EXISTS e richiede di ragionare in base al concetto di controesempio. Un impiegato I verifica l’interrogazione se non esiste un progetto che ha un budget maggiore di 50000, ed a cui l’impiegato I non partecipa. A.A. 2005/2006 Basi di Dati e Laboratorio 67 DIVISIONE - ESEMPIO SELECT ID FROM Impiegato I WHERE NOT EXISTS (SELECT * FROM Progetto Y WHERE Budget > 50000 AND NOT EXISTS (SELECT * FROM Partecipazione P WHERE I.ID = P.ID AND Y.Prog# = P.Prog#)) A.A. 2005/2006 Basi di Dati e Laboratorio 68