Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
8-12-2011 1
Operatori aggregati: COUNT • Il numero di figli di Franco
select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco'
l’operatore aggregato (count) viene applicato al risultato dell’interrogazione:
select * from Paternita where Padre = 'Franco'
8-12-2011 2
Padre Paternità Figlio
Luigi Luigi
Sergio Olga
Filippo Franco Franco
Andrea Aldo
Franco
Franco Franco
Andrea Aldo
NumFigliDiFranco 2
8-12-2011 3
COUNT e valori nulli select count(*) from persone
select count(reddito) from persone
select count(distinct reddito) from persone
Nome Età Persone Reddito Andrea 27
Maria 55 Anna 50
Aldo 25 21
21 35
NULL
8-12-2011 4
Altri operatori aggregati SUM, AVG, MAX, MIN
Media dei redditi dei figli di Franco
select avg(reddito) from persone join paternita on nome=figlio where padre='Franco‘
Select avg(reddito) From persone, paternita Where (padre=‘Franco’) and (nome=figlio)
8-12-2011 5
Operatori aggregati e valori nulli
select avg(reddito) as redditomedio from persone
Nome Età Persone Reddito Andrea 27
Maria 55 Anna 50
Aldo 25 30
36 36
NULL
8-12-2011 6
Operatori aggregati e target list
un’interrogazione scorretta:
select nome, max(reddito) from persone
di chi sarebbe il nome? La target list deve essere omogenea
select min(eta), avg(reddito) from persone
8-12-2011 7
Le funzioni possono essere applicate a partizioni delle relazioni
Clausola GROUP BY: GROUP BY listaAttributi
Operatori aggregati e raggruppamenti
8-12-2011 8
Il numero di figli di ciascun padre select padre, count(*) AS NumFigli from paternita group by Padre
Operatori aggregati e raggruppamenti
Padre paternita Figlio
Luigi Luigi
Sergio Olga
Filippo Franco Franco
Andrea Aldo
Franco Padre NumFigli
Luigi Sergio
2 Franco 2
1
8-12-2011 9
Semantica di interrogazioni con operatori aggregati e raggruppamenti
1. interrogazione senza group by e senza operatori aggregati select * from paternita
2. si raggruppa e si applica l’operatore aggregato a ciascun gruppo
8-12-2011 10
Raggruppamenti e target list scorretta
select padre, avg(f.reddito), p.reddito from persone f join paternita on figlio = nome join
persone p on padre =p.nome group by padre
corretta select padre, avg(f.reddito), p.reddito from persone f join paternita on figlio = nome join
persone p on padre =p.nome group by padre, p.reddito
8-12-2011 11
Condizioni sui gruppi I padri i cui figli hanno un reddito medio maggiore di
25
select padre, avg(f.reddito) from persone f join paternita on figlio = nome group by padre having avg(f.reddito) > 25
8-12-2011 12
Condizioni sui gruppi I padri i cui figli con reddito minore di 20 hanno
un’età media minore di 40
select padre, avg(f.età) from persone f join paternita on figlio = nome Where f.reddito<20 group by padre having avg(f.età) <40
8-12-2011 13
WHERE o HAVING? I padri i cui figli sotto i 30 anni hanno un reddito
medio maggiore di 20
select padre, avg(f.reddito) from persone f join paternita on figlio = nome where eta < 30 group by padre having avg(f.reddito) > 25
8-12-2011 14
Sintassi, riassumiamo SelectSQL ::=
select ListaAttributiOEspressioni from ListaTabelle [ where CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ]
8-12-2011 15
Interrogazioni nidificate
le condizioni atomiche permettono anche il confronto fra un attributo (o più,
vedremo poi) e il risultato di una sottointerrogazione
quantificazioni esistenziali
8-12-2011 16
nome e reddito del padre di Franco
select Nome, Reddito from Persone, Paternita where Nome = Padre and Figlio = 'Franco'
select Nome, Reddito from Persone where Nome = ( select Padre from Paternita
where Figlio = 'Franco‘ )
8-12-2011 17
Interrogazioni nidificate, commenti La forma nidificata è “meno dichiarativa”, ma
talvolta più leggibile (richiede meno variabili) La forma piana e quella nidificata possono
essere combinate Le sottointerrogazioni non possono contenere
operatori insiemistici (“l’unione si fa solo al livello esterno”); la limitazione non è significativa
8-12-2011 18
Nome e reddito dei padri di persone che guadagnano più di 20 milioni
select distinct P.Nome, P.Reddito from Persone P, Paternita, Persone F where P.Nome = Padre and Figlio = F.Nome
and F.Reddito > 20
select Nome, Reddito from Persone where Nome in (select Padre
from Paternita where Figlio = any (select Nome from Persone where Reddito > 20))
8-12-2011 19
Nome e reddito dei padri di persone che guadagnano più di 20 milioni
select distinct P.Nome, P.Reddito from Persone P, Paternita, Persone F where P.Nome = Padre and Figlio = F.Nome
and F.Reddito > 20
select Nome, Reddito from Persone where Nome in ( select Padre
from Paternita, Persone where Figlio = Nome and Reddito > 20 )
8-12-2011 20
Interrogazioni nidificate, commenti, 2
La prima versione di SQL prevedeva solo la forma nidificata (o strutturata), con una sola relazione in ogni clausola FROM. Il che è insoddisfacente: la dichiaratività è limitata non si possono includere nella target list
attributi di relazioni nei blocchi interni
8-12-2011 21
Nome e reddito dei padri di persone che guadagnano più di 20 milioni, con indicazione del reddito del figlio
select distinct P.Nome, P.Reddito, F.Reddito from Persone P, Paternita, Persone F where P.Nome = Padre and Figlio = F.Nome
and F.Reddito > 20
select Nome, Reddito, ???? from Persone where Nome in (select Padre
from Paternita where Figlio = any (select Nome from Persone where Reddito > 20))
8-12-2011 22
Interrogazioni nidificate, commenti, 3
regole di visibilità: non è possibile fare riferimenti a variabili definite in
blocchi più interni se un nome di variabile è omesso, si assume
riferimento alla variabile più “vicina”
in un blocco si può fare riferimento a variabili definite in blocchi più esterni; la semantica base (prodotto cartesiano, selezione, proiezione) non funziona più, vedremo presto
8-12-2011 23
Quantificazione esistenziale Ulteriore tipo di condizione
EXISTS ( Sottoespressione )
8-12-2011 24
Le persone che hanno almeno un figlio
select * from Persone where exists ( select * from Paternita where Padre = Nome) or exists ( select * from Maternita where Madre = Nome)
8-12-2011 25
I padri i cui figli guadagnano tutti più di venti milioni
select distinct Padre from Paternita Z where not exists ( select * from Paternita W, Persone where W.Padre = Z.Padre and W.Figlio = Nome and Reddito <= 20)
8-12-2011 26
I padri i cui figli guadagnano tutti più di venti milioni
select Padre from Paternita
except select Padre
from Paternita, Persone where Figlio = Nome and Reddito <= 20
8-12-2011 27
Massimo e nidificazione La persona (o le persone) con il reddito
massimo
select * from persone where reddito = (select max(reddito)
from persone)
8-12-2011 28
Massimo e nidificazione La persona (o le persone) con il reddito
massimo
select * from persone P1 where not exists (select * from persone P2 where p2.reddito>p1.reddito)
8-12-2011 29
Differenza select Nome from Impiegato union / intersect / except select Cognome as Nome from Impiegato
vedremo che si può esprimere con select nidificate
8-12-2011 30
Intersezione
select Nome from Impiegato intersect select Cognome as Nome from Impiegato
equivale a
select I.Nome from Impiegato I, Impiegato J where I.Nome = J.Cognome