Fondamenti di Informatica
Funzioni di Aggregazione e Raggruppamenti in SQL
Pro f. M a rco Lo mb a rd i
Le Funzioni di Aggregazione – 1/10
•
Le funzioni di aggregazione (dette anche
funzioni aggregate o «di colonna»)
•
Permettono di collezionare (aggregare) valori in
input
•
Operano su singola colonna (campo)
•
Restituiscono un singolo valore
•
Utilizzate solo nelle interrogazioni (SELECT)
•
Lo standard SQL mette a disposizione le seguenti funzioni
aggregate
Funzione SQL
Descrizione
MIN
Restituisce il minimo dell’insieme di input
MAX
Restituisce il massimo dell’insieme di input
SUM
Restituisce la somma dell’insieme di input
AVG
Restituisce la media dell’insieme di input
STDEV
Restituisce la deviazione standard dell’insieme di input
VARIANCE
Restituisce la varianza dell’insieme di input
COUNT
Restituisce il numero di elementi dell’insieme di input
Le Funzioni di Aggregazione – 2/10
•
Esempio 1
SELECT MIN(prezzo) FROM giocattolo;
10
prodID
descrizione
prezzo
2504 Peluche 10 2809 Macchinina 25 3487 Pista 50 2980 Bambola 30
Tabella: giocattolo
Le Funzioni di Aggregazione – 3/10
L’interrogazione restituisce il minimo valore del
campo prezzo
•
Esempio 2
SELECT MAX(prezzo) FROM giocattolo;
50
prodID
descrizione
prezzo
2504 Peluche 10 2809 Macchinina 25 3487 Pista 50 2980 Bambola 30
Tabella: giocattolo
Le Funzioni di Aggregazione – 4/10
L’interrogazione restituisce il massimo valore
del campo prezzo
•
Esempio 3
clienteID
nome
cognome
cap
citta
50 Mario Rossi 84084 Fisciano 51 Giulio Bianchi 84084 Fisciano 52 Silvio Blu 84121 Salerno 58 Maria Azzurro 84125 Salerno 60 Luigi Magenta 84081 Baronissi 61 Giorgio Viola 84025 Eboli
SELECT COUNT(citta) FROM cliente WHERE citta LIKE ‘Fis%’;
2
Tabella: cliente
Le Funzioni di Aggregazione – 5/10
L’interrogazione restituisce il numero di record in cui il valore del
campo citta inizia per la sottostringa ‘Fis’
•
Esempio 4
SELECT COUNT(modello)
FROM auto
WHERE modello LIKE ‘%500%’;
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015 FIAT500_2 FIAT 500 NULL
Tabella: auto
3
Le Funzioni di Aggregazione – 6/10
L’interrogazione restituisce il numero di record in cui il valore del
campo modello contiene la sottostringa ‘500’
•
Esempio 5
SELECT AVG(salario_annuo) FROM impiegato;
matricola
nome
cognome
salario_annuo
0101 Giorgio Blu 22000 0210 Mario Rossi 28900 0451 Luigi Bianchi 24000 54023 Maria Giallo 23000 4124 Guido Viola 19000
Tabella: impiegato
23380
Le Funzioni di Aggregazione – 7/10
L’interrogazione restituisce il valore medio del campo
salario_annuo
•
Esempio 6
SELECT SUM(salario_annuo)
FROM impiegato
WHERE salario_annuo >= 23000;
matricola
nome
cognome
salario_annuo
0101 Giorgio Blu 22000 0210 Mario Rossi 28900 0451 Luigi Bianchi 24000 54023 Maria Giallo 23000 4124 Guido Viola 19000
Tabella: impiegato
75900
Le Funzioni di Aggregazione – 8/10
L’interrogazione restituisce la somma dei valori maggiori o uguali a 23000, relativi
al campo salario_annuo
•
Esempio 7
SELECT MIN(salario_annuo), MAX(salario_annuo) FROM impiegato;
matricola
nome
cognome
salario_annuo
0101 Giorgio Blu 22000 0210 Mario Rossi 28900 0451 Luigi Bianchi 24000 54023 Maria Giallo 23000 4124 Guido Viola 19000
Tabella: impiegato
19000
28900
Le Funzioni di Aggregazione – 9/10
L’interrogazione restituisce il valore minimo ed
il valore massimo del campo prezzo
•
Utilizzando l’opzione DISTINCT, vengono considerati solo i
valori distinti
•
Esempio 8
SELECT COUNT(DISTINCT marca) FROM auto;
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015 FIAT500_2 FIAT 500 NULL
Tabella: auto
3
Le Funzioni di Aggregazione – 10/10
L’interrogazione restituisce il numero di valori distinti
del campo marca
•
Può essere migliorata la leggibilità del risultato di una query
(mediante l’istruzione SELECT)
•
Si può assegnare temporaneamente un alias (ovvero uno
pseudonimo) ad uno o più campi e/o ad uno o più tabelle
•
L’alias di un campo può essere assegnato utilizzando la
parola chiave AS
Esempio
•
La parola chiave
AS
può essere anche omessa (facendo seguire il
nome dell’alias al nome del campo)
SELECT nome_campo AS AliasDelCampo FROM tabella;
SELECT nome_campo AliasDelCampo FROM tabella;
Gli Alias in SQL – 1/3
Esempio 1
Istruzione equivalente:
SELECT salario_annuo AS SalarioAnnuoPercepito FROM impiegato;
matricola
nome
cognome
salario_annuo
0101 Giorgio Blu 22000 0210 Mario Rossi 28900 0451 Luigi Bianchi 24000 54023 Maria Giallo 23000 4124 Guido Viola 19000
SalarioAnnuoPercepito
22000 28900 24000 23000 19000SELECT salario_annuo SalarioAnnuoPercepito FROM impiegato;
Tabella: impiegato
SELECT MIN(salario_annuo) AS SalarioAnnuoMinimo FROM cliente;
Tabella: impiegato
SalarioAnnuoMinimo
19000
SELECT SUM(salario_annuo) AS sommaDeiSalari FROM cliente;
sommaDeiSalari
116900
matricola
nome
cognome
salario_annuo
0101 Giorgio Blu 22000 0210 Mario Rossi 28900 0451 Luigi Bianchi 24000 54023 Maria Giallo 23000 4124 Guido Viola 19000
AS può essere utilizzato
anche in combinazione con le
funzioni di aggregazione
•
I valori ottenuti come risultato delle funzioni di
aggregazione si riferiscono a tutti i record, che soddisfano le
caratteristiche e le condizioni specificate dalla clausola
WHERE
•
Spesso è opportuno che tali valori vengano ottenuti
considerando gruppi omogenei di record
•
Esempi
•
Numero degli studenti iscritti al Corso di Laurea in Ingegneria Meccanica
•
Numero degli studenti iscritti al Corso di Laurea in Ingegneria Gestionale
•
Salario medio dei dipendenti che lavorano presso la stessa sede
•
Mediante la clausola GROUP BY è possibile definire tali gruppi
•
La clausola GROUP BY permette quindi di definire dei gruppi
omogenei, specificando una o più colonne (dette colonne di
riferimento)
•
Sulla base delle colonne di riferimento specificate, i record verranno
raggruppati per valori uguali
•
La clausola GROUP BY permette quindi di definire dei gruppi
omogenei, specificando una o più colonne (dette colonne di
riferimento)
•
Sulla base delle colonne di riferimento specificate, i record verranno
raggruppati per valori uguali
•
Esempio 1
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015
Tabella: auto
SELECT marca, COUNT(*) AS NumeroAuto FROM auto GROUP BY marca;
I Raggruppamenti – 3/5
•
La clausola GROUP BY permette quindi di definire dei gruppi
omogenei, specificando una o più colonne (dette colonne di
riferimento)
•
Sulla base delle colonne di riferimento specificate, i record verranno
raggruppati per valori uguali
•
Esempio 1
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015
Tabella: auto
SELECT marca, COUNT(*) AS NumeroAuto FROM auto GROUP BY marca;
Colonna di riferimento
I Raggruppamenti – 3/5
•
La clausola GROUP BY permette quindi di definire dei gruppi
omogenei, specificando una o più colonne (dette colonne di
riferimento)
•
Sulla base delle colonne di riferimento specificate, i record verranno
raggruppati per valori uguali
•
Esempio 1
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015
Tabella: auto
SELECT marca, COUNT(*) AS NumeroAuto FROM auto GROUP BY marca;
Colonna di riferimento
I record saranno
raggruppati per valori
uguali presenti nella
colonna marca
•
La clausola GROUP BY permette quindi di definire dei gruppi
omogenei, specificando una o più colonne (dette colonne di
riferimento)
•
Sulla base delle colonne di riferimento specificate, i record verranno
raggruppati per valori uguali
•
Esempio 1
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015
Tabella: auto
SELECT marca, COUNT(*) AS NumeroAuto FROM auto GROUP BY marca;
Colonna di riferimento
I record saranno raggruppati
per valori uguali presenti nella
colonna marca
A ciascun gruppo si applica la
funzione aggregata count
•
La clausola GROUP BY permette quindi di definire dei gruppi
omogenei, specificando una o più colonne (dette colonne di
riferimento)
•
Sulla base delle colonne di riferimento specificate, i record verranno
raggruppati per valori uguali
•
Esempio 1
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015
Tabella: auto
SELECT marca, COUNT(*) AS NumeroAuto FROM auto GROUP BY marca;
marca
NumeroAuto
FIAT 3
Alfa Romeo 1
Jeep 1
•
Esempio 2
Tabella: impiegato
SELECT sede, AVG(salario_annuo) AS SalarioMedio
FROM impiegato
GROUP BY sede;
matricola
nome
cognome
salario_annuo
sede
0101 Giorgio Blu 22000 Fisciano 0210 Mario Rossi 28900 Fisciano 0451 Luigi Bianchi 24000 Salerno 54023 Maria Giallo 23000 Baronissi
4124 Guido Viola 19000 Salerno
sede
SalarioMedio
Fisciano 25450 Salerno 21500 Baronissi 23000
I Raggruppamenti – 4/5
•
Esempio 3
Tabella: studente
SELECT corso_laurea, AVG(voto_laurea) AS VotoMedio
FROM studente
GROUP BY corso_laurea;
corso_laurea
VotoMedio
ING_GEST 95 ING_MECC 95
matricola
nome
cognome
voto_laurea
corso_laurea
00001
Mario
Rossi
100
ING_GEST
00002
Giovanni
Gialli
95
ING_MECC
00003
Mario
Blu
90
ING_GEST
00005
Alfonso
Magenta
93
ING_MECC
00012
Giorgio
Bianchi
97
ING_MECC
•
La clausola GROUP BY in combinazione con la
clausola HAVING
•
Permette di definire un vincolo sui dati risultanti
dall'operazione di raggruppamento
•
Sostanzialmente la clausola HAVING ha un
comportamento simile a quello della clausola
WHERE, ma opera sui raggruppamenti e non sui
record
•
Esempio
Raggruppamenti con Condizioni – 2/2
SELECT marca, COUNT(*) AS NumeroAuto
FROM auto
GROUP BY marca
HAVING COUNT(*) > 1;
autoID
marca
modello
immatricolazione
FIAT500_1 FIAT 500 2011 FIAT500L_1 FIAT 500L 2014 ALFAGIULIA_1 Alfa Romeo Giulia 2016 JEEPR_1 Jeep Renegade 2015 FIAT500_2 FIAT 500 NULL