30
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'

Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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'

Page 2: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

8-12-2011 2

Padre Paternità Figlio

Luigi Luigi

Sergio Olga

Filippo Franco Franco

Andrea Aldo

Franco

Franco Franco

Andrea Aldo

NumFigliDiFranco 2

Page 3: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 4: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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)

Page 5: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 6: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 7: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

8-12-2011 7

  Le funzioni possono essere applicate a partizioni delle relazioni

  Clausola GROUP BY: GROUP BY listaAttributi

Operatori aggregati e raggruppamenti

Page 8: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 9: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 10: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 11: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 12: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 13: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 14: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

8-12-2011 14

Sintassi, riassumiamo SelectSQL ::=

select ListaAttributiOEspressioni from ListaTabelle [ where CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ]

Page 15: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 16: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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‘ )

Page 17: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 18: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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))

Page 19: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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 )

Page 20: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 21: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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))

Page 22: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 23: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

8-12-2011 23

Quantificazione esistenziale   Ulteriore tipo di condizione

  EXISTS ( Sottoespressione )

Page 24: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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)

Page 25: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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)

Page 26: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 27: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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)

Page 28: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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)

Page 29: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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

Page 30: Operatori aggregati: COUNT · 8-12-2011 1 Operatori aggregati: COUNT • Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' l’operatore

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