Linguaggio SQL – funzioni di aggregazione e raggruppamenti

Linguaggio SQL

Le funzioni di aggregazione

L’aggregazione è una forma di interrogazione attraverso cui si ottengono risultati riepilogativi del contenuto di una tabella; a tale scopo si utilizzano delle funzioni speciali che restituiscono un solo valore, e come tali concorrono a creare un’unica riga.

La funzione COUNT

La funzione COUNT conta il numero di righe presenti in una tabella, la cardinalità di una relazione. La sintassi del linguaggio SQL richiede di specificare come argomento della funzione il nome di un attributo oppure il carattere * (asterisco): nel primo caso non vengono conteggiate le righe che hanno valore NULL nella colonna dell’attributo specificato; nel secondo caso, indicando l’asterisco, la funzione COUNT(*) calcola il numero delle righe della tabella, incluse quelle con campi di tipo NULL.
La funzione calcola solo il numero delle righe, indipendentemente dai valori in esse memorizzati. Il seguente comando restituisce il numero di tutte le righe presenti nella tabella Personale:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT COUNT (*)
FROM Alunni;
[/code]

Specificando invece il nome dell’attributo Classe come argomento della funzione COUNT, si ottiene il numero di Alunni per i quali è specificato l’indirizzo mail nella tabella Alunni:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT COUNT (E_Mail)
FROM Alunni;
[/code]

Se si utilizza una selezione (clausola WHERE), la funzione Count restituisce il numero delle righe che soddisfano la condizione specificata. La seguente interrogazione restituisce il numero dei Alunni della classe II A della tabella Alunni:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT COUNT(Codice)
FROM Alunni
WHERE Classe = ‘IIA’;
[/code]

Il risultato del conteggio può essere anche descritto con un’opportuna intestazione aggiungendo la clausola AS:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT COUNT(Codice) As ‘Alunni Classe IIA’
FROM Alunni
WHERE Classe = ‘IIA’;
[/code]

E’ anche possibile utilizzare la clausola DISTINCT per ottenere il numero de valori diversi tra loro nella colonna specificata.
Ad esempio per conoscere quante classi esistono nella tabella Alunni occorre la seguente struttura:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT COUNT(DISTINCT Classe)
FROM Alunni;
[/code]

La clausola DISTINCT non può essere usata nel formato con l’asterisco COUNT(*).

Funzione SUM

La funzione SUM restituisce la somma di tutti i valori contenuti in una colonna, naturalmente di tipo numerico, specificata come argomento della funzione. Il seguente comando restituisce la somma degli stipendi relativi a tutte le righe presenti nella tabella Dipendenti:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT SUM (Stipendio)
FROM Dipendenti;
[/code]

Utilizzando l’Alias si ottiene invece:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT SUM (Stipendio) AS ‘Totale_Stipendi’
FROM Dipendenti;
[/code]

Nel caso siano presenti valori NULL, essi saranno considerati come aventi valore 0.
Se si utilizza una selezione (clausola WHERE), la funzione prenderà in esame solo le righe che soddisfano la condizione specificata. La seguente interrogazione restituisce la somma degli Stipendi relativi alla mansione Amministrazione:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT SUM (Stipendio)
FROM Dipendenti
WHERE Mansione = ‘Amministrazione’;
[/code]

Se necessario, è possibile utilizzare anche la parola chiave DISTINCT.
L’argomento della funzione SUM può anche essere un’espressione numerica contenente i nomi delle colonne di tipo numerico interessate. Si supponga ad esempio di voler calcolare il totale delle vendite in un determinato giorno:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT SUM (Prezzo * Quantita) AS ‘Totale’
FROM Vendite
WHERE Giorno =’01/01/2016′
[/code]

Funzione AVG

La funzione AVG (dall’inglese Average) calcola la media aritmetica dei valori numerici contenuti in una determinata colonna di una tabella, con l’eventuale aggiunta dell’opzione DISTINCT; l’argomento della funzione può essere un’espressione aritmetica anziché il nome dì un attributo.
La funzione non include nel calcolo i valori di tipo NULL presenti nella colonna.
Nell’esempio seguente viene calcolato il voto medio degli alunni della classe II A:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT AVG(Voto)
FROM Alunni
WHERE Classe = ‘IIA’;
[/code]

Funzioni MIN e MAX

Le funzioni MIN e MAX restituiscono rispettivamente il valore minimo e il valore massimo tra i valori della colonna, anche di tipo carattere, specificata come argomento della funzione; anche in tal caso, specificando la clausola WHERE calcolano il valore minimo e massimo dei valori di una colonna considerando solo le righe che soddisfano alla condizione. Ecco due esempi:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT MIN(Voto) AS ‘Voto Minimo’
FROM Alunni
WHERE Classe = ‘IIA’;

SELECT MAX(Cognome)
FROM Alunni
WHERE Classe = ‘IIA’;
[/code]

Anche le funzioni MIN e MAX ignorano i campi con valore NULL e possono avere come argomento un’espressione anziché il nome di un attributo.

 

E’ anche possibile utilizzare più funzioni di aggregazione contemporaneamente; ad esempio:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT MAX(Voto), MIN(Voto), AVG(Voto)
FROM Alunni
WHERE Classe = ‘IIA’;
[/code]

Raggruppamenti

I valori di sintesi calcolati dalle funzioni aggregate si riferiscono a tutte le tuple che soddisfano le condizioni delle clausola WHERE.
In molti casi è viceversa opportuno fornire tali valori per gruppi omogenei di tuple, come ad esempio il numero di alunni per ogni classe.

In tale ottica, la clausola GROUP BY del comando SELECT consente di raggruppare le righe di una tabella in base ai valori di uno o più attributi, potendo cosi applicare le funzioni di aggregazione ai singoli gruppi di righe. Utilizzando l’esempio precedente si ha:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT Classe, Count(*) AS ‘Alunni della Classe’
FROM Alunni
GROUP BY Classe
ORDER BY Classe;
[/code]

Si ricordi che tutte le colonne che compaiono accanto alla parola SELECT devono essere inclusi nella clausola GROUP BY oppure devono essere argomenti di una funzione di aggregazione.

Oltre a raggruppare, è anche possibile selezionare dei gruppi sulla base di loro proprietà “complessive”; in altre parole, è possibile impostare una condizione utilizzando, al posto di WHERE, la clausola HAVING.
Se, ad esempio, occorre elencare le classi che hanno più di 15 alunni occorre scrivere così:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT Classe, Count(*) AS ‘Alunni della Classe’
FROM Alunni
GROUP BY Classe
HAVING (Count(*)>15)
ORDER BY Classe;
[/code]

Nella clausola HAVING si possono avere due tipi di predicati:

  • Predicati che fanno uso di funzioni aggregate (COUNT(*)>15),
  • Predicati che si riferiscono alle colonne di raggruppamento.

Se, invece, occorre elencare le classi della sezione “A” che hanno più di 15 alunni occorre scrivere così:

[code language=”sql” gutter=”true” collapse=”false”]
SELECT Classe, Count(*) AS ‘Alunni della Classe’
FROM Studenti
WHERE Classe like "%A"
GROUP BY Classe
HAVING (Count(*)>15)
ORDER BY Classe;
[/code]

Visite: 482