Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di...

Post on 07-Oct-2020

0 views 0 download

Transcript of Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di...

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