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