5° Anno TEORIA 4. Introduzione al linguaggio SQL | Page 48

16. Il linguaggio SQL Vers. 11.0 – Gennaio 2026
Per raggruppare i dipendenti in base al loro livello e conoscere lo stipendio medio per livello possiamo scrivere:
SELECT Livello, AVG( Stipendio) FROM Dipendente GROUP BY Livello;
Filtraggio sul raggruppamento
+--------- +---------------- +
| Livello | AVG( Stipendio) |
+--------- +---------------- +
|
7 |
1200.000000 |
|
8 |
1850.000000 |
|
9 |
4200.000000 |
+--------- +---------------- +
A differenza di WHERE, che agisce a livello di singola riga, la parola chiave opzionale HAVING permette di effettuare un filtraggio sul ragguppamento.
Questa clausola si inserisce subito dopo la GROUP BY.
Il criterio di filtraggio può contenere una qualsiasi funzione di raggruppamento ma anche un altro eventuale predicato logico:
Per raggruppare i dipendenti in base al loro livello e conoscere lo stipendio medio a partire dall’ 8 ° livello, possiamo scrivere:
SELECT Livello, AVG( Stipendio) FROM Dipendente GROUP BY Livello HAVING Livello >= 8;
+--------- +---------------- + | Livello | AVG( Stipendio) | +--------- +---------------- + | 8 | 1850.000000 | | 9 | 4200.000000 | +--------- +---------------- +
Del tutto analoga, in questo caso, la seguente query che non fa utilizzo della clausola HAVING
SELECT Livello, AVG( Stipendio) FROM Dipendente WHERE( Livello >= 8) GROUP BY Livello;
Nota bene
Nell’ istruzione SELECT, la differenza principale tra la clausola opzionale WHERE( detta " taglio orizzontale ") e la clausola opzionale HAVING sui raggruppamenti( detto " taglio orizzontale sui gruppi ") è che la clausola WHERE viene utilizzata per filtrare i record( ossia le singole ennuple) PRIMA che si verifichi un raggruppamento o un ' aggregazione, mentre HAVING si utilizza per filtrare i record DOPO un raggruppamento o che si è verificata un ' aggregazione.
SELECT Livello, COUNT(*) FROM Dipendente GROUP BY Livello HAVING COUNT(*) = 2; analoga a
SELECT Livello, COUNT(*) AS Totale FROM Dipendente GROUP BY Livello HAVING Totale = 2;
SELECT Livello, COUNT(*) FROM Dipendente WHERE COUNT(*) = 2 GROUP BY Livello;
ERRORE!!! Non è possibile utilizzare le funzioni di aggregazione nella clausola WHERE a meno che esse non si trovino in una sottoquery annidata
Autore: Rio Chierego( email: riochierego @ libero. it- sito web: www. riochierego. it) Pag. 48