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

16 . Il linguaggio SQL Vers . 9.3 – Marzo 2024
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