Oltre a leggere i valori “riga per riga”, in molti casi è utile sottoporre le tabelle a valutazioni che li coinvolgono in gruppo. A questo scopo si utilizzano le cosiddette funzioni di aggregazione, tre la quali troviamo:
-
COUNT
-
COUNT(DISTINCT)
COUNT
-
MAX
-
MIN
-
AVG
-
SUM
Esistono altre funzioni di questo genere. Se ne può trovare un elenco esaustivo nell'apposita pagina della documentazione ufficiale. Esiste anche un nutrito gruppo di funzioni a carattere statistico.
Funzioni di aggregazione: esempi
Prendiamo ad esempio una tabella che, nel client mysql, si mostra come in figura:
Il campo importo descrizione
Gli esempi qui di seguito riportati utilizzano le funzioni di aggregazione sul predetto insieme, e mostrano i risultati ottenuti:
> SELECT COUNT(importo) FROM spese;
9
> SELECT COUNT(DISTINCT importo) FROM spese;
7
> SELECT SUM(importo) FROM spese;
527
> SELECT AVG(importo) FROM spese;
58.5556
> SELECT MIN(importo) FROM spese;
4
> SELECT MAX(importo) FROM spese;
150
Si noti che i valori 4 e 65 sono ripetuti nell'insieme: questo giustifica la differenza di risultato tra COUNT
COUNT(DISTINCT)
È importante notare il rapporto che le funzioni di aggregazione hanno con operatori molto importanti di SQL, quali WHERE
GROUP BY
> SELECT SUM(importo) FROM spese WHERE descrizione='cartoleria';
36
Per quanto riguarda l'uso del costrutto GROUP BY
> SELECT descrizione, MIN(importo) FROM spese;
alimentari | 4
Il valore minimo individuato è 4 (e ciò è corretto) ma l'associazione sulla stessa riga del termine alimentari
cartoleria
MIN
Per avere dei risultati corretti e che non traggano in inganno come nell'esempio precedente è necessario che la proiezione, ossia l'elenco dei campi indicati dopo il SELECT
GROUP BY
La seguente query:
> SELECT descrizione, MIN(importo) FROM spese GROUP BY descrizione;
alimentari | 23
cartoleria | 4
strumenti | 88
mostra un risultato veritiero. Saranno raggruppati i record in base alla descrizione e per ogni gruppo verrà individuato il minimo.
La clausola UNION
La clausola UNION
viene usata per unire i risultati di due query.
Affinchè il tutto possa funzionare è necessario che le proiezioni delle due SELECT
coinvolte siano composte dallo stesso numero di campi, e che i tipi di dato degli stessi siano compatibili con quelli corrispondenti nell'altra query.
Ad esempio, immaginiamo di avere due tabelle con la stessa struttura, di nome dati e dati_archivio, dove quest'ultima, come spesso può capitare, contiene vecchi record un tempo inseriti nella prima ed ormai conservati solo per valore storico:
SELECT descrizione, importo, data_operazione FROM dati
UNION
SELECT descrizione, importo, data_operazione FROM dati_archiviati
Il risultato sarà un unico set di record reperiti da entrambe le tabelle.
Al posto di UNION
si può usare UNION ALL
, che mostrerà anche i valori duplicati, mentre il comportamento di default di UNION
non lo fa.