Le funzioni di gruppo vengono valutate su un insieme di righe per volta e differiscono dalle funzioni a singola riga, trattate nelle lezioni precedenti, che invece coinvolgono una sola volta per ogni riga restituita dalla query. Oracle mette a nostra disposizione un'ampia gamma di queste funzioni, ma noi tratteremo solamente quelle più utilizzate.
Le funzioni di gruppo possono essere impiegate sulle colonne interrogate mediante lo statement SELECT
, usando la clausola GROUP BY
e assieme alla clausola finale HAVING
.
Esse non considerano mai i valori NULL
e mai restituiscono NULL
. Quando ad esempio le righe di una tabella contengono solamente valori NULL
, le funzioni di gruppo restituiscono il valore 0 (zero).
Gli esempi di questa lezione sono stati eseguiti con l'utente "hr" facente parte del database "Seed". Useremo la stringa di connessione "C:>sqlplus hr/hrpassword@test-servizio
" per collegarci al database Seed da una finestra DOS, oppure la versione grafica di SQL* Plus come abbiamo già visto.
Funzioni di gruppo
AVG
La funzione restituisce la media aritmetica di un gruppo di valori numerici.
Esempio
SQL> SELECT job_id, AVG (salary) 2 FROM employees 3 GROUP BY job_id;
Nell'esempio la clausola GROUP BY
ha inizialmente raggruppato, considerando la colonna job_id
, tutte le righe della tabella employees
e successivamente, per ogni gruppo creato, la funzione AVG
ha calcolato la media aritmetica dei salari.
COUNT
La funzione calcola il numero di righe restituite dalla query. Non considera i valori NULL per la colonna su cui è applicata.
Sintassi di COUNT
COUNT (* | DISTINCT | <espr>)
Usiamo l'asterisco (*) affinché la funzione COUNT
conti tutte le righe risultanti dalla query, oppure la clausola DISTINCT
per eliminare dalla query le copie delle righe (tenendo conto dell'espressione indicata) che non saranno quindi conteggiate.
Esempio
SQL> SELECT COUNT (*) AS Nr_Tot, 2 COUNT (DISTINCT department_id) AS Nr_Dist 3 FROM employees;
Nell'esempio abbiamo sia calcolato il numero di impiegati presenti in tabella, cioè il numero di righe della tabella employees, che il numero di dipartimenti aventi almeno un impiegato.
MAX
La funzione restituisce il valore massimo di un insieme di dati, ovvero di una colonna di tabella o di un'espressione. Se la funzione è impiegata su:
- un insieme di date/orari (datatype DATE) allora restituisce la data/ora più recente;
- un insieme di numeri (datatype NUMBER) allora restituisce il numero più elevato;
- un insieme di stringhe (datatype CHAR e VARCHAR2) allora restituisce la stringa in ultima posizione tenendo conto di un ordinamento alfabetico crescente.
Esempio
SQL> SELECT MAX (hire_date), 2 MAX (salary), 3 MAX (last_name) 4 FROM employees;
Nell'esempio abbiamo calcolato la data di assunzione più recente, il massimo salario percepito, il cognome dell'impiegato situato in ultima posizione di un ordinamento alfabetico crescente. Tutti questi dati non devono, per ragion di logica, necessariamente appartenere alla stessa persona.
Possiamo utilizzare anche la clausola DISTINCT
per il calcolo del valore massimo, ma questa non sortirebbe alcun effetto in quanto il valore massimo di un gruppo di dati è uguale al valore massimo dello stesso gruppo privato delle copie dei dati. Proviamo con l'esempio successivo.
Esempio
SQL> SELECT MAX (DISTINCT salary) AS Sal_Dist 2 FROM employees;
MIN
La funzione restituisce il valore minimo di un insieme di dati, ovvero di una colonna di tabella o di un'espressione. Se la funzione è impiegata su:
- un insieme di date/orari (datatype DATE) allora restituisce la data/ora più remota;
- un insieme di numeri (datatype NUMBER) allora restituisce il numero più piccolo;
- un insieme di stringhe (datatype CHAR e VARCHAR2) allora restituisce la stringa in prima posizione tenendo conto di un ordinamento alfabetico in ordine crescente.
Esempio
SQL> SELECT MIN (hire_date), 2 MIN (salary), 3 MIN (last_name) 4 FROM employees;
Nell'esempio abbiamo calcolato la data di assunzione più remota, il minimo salario percepito, il cognome dell'impiegato situato in prima posizione di un ordinamento alfabetico crescente. Ddati che non devono necessariamente appartenere alla stessa persona.
Valgono le stesse regole per la clausola DISTINCT viste nella funzione precedente.
Esempio
SQL> SELECT MIN (DISTINCT salary) AS Min_Dist 2 FROM employees;
SUM
La funzione restituisce la somma di un insieme di valori, ovvero di una colonna di tabella o di un'espressione. Possiamo usare la clausola DISTINCT
per calcolare la somma di valori distinti, quindi unici, all'interno di un insieme di dati.
Esempio
SQL> SELECT SUM (salary) AS Sum, 2 SUM (DISTINCT salary) AS Dist 3 FROM employees;
Nell'esempio abbiamo calcolato la somma di tutti i salari percepiti dagli impiegati e la somma di tutti i salari distinti.