Raggruppare i dati significa fondamentalmente creare sottoinsiemi di dati in base a precisi criteri di raggruppamento. Consideriamo come esempio una società di informatica formata da diversi dipartimenti: grafica, sviluppo applicazioni, progettazione database, human resources ed altro ancora.
In questa società lavorano tanti impiegati, ciascuno assegnato ad un preciso dipartimento considerando la mansione lavorativa che questi andrà a svolgere. Raggruppare gli impiegati per dipartimento (questo è definito come criterio di raggruppamento) significa conoscere quanti impiegati lavorano in ciascun dipartimento.
In Oracle il raggruppamento dei dati viene eseguito con la clausola GROUP BY, dello statement SELECT, seguita dal criterio di raggruppamento.
Esempio
SQL> SELECT department_id AS ID, COUNT (*) AS Count_Dept 2 FROM employees 3 GROUP BY department_id;
Nell'esempio abbiamo appunto calcolato quanti impiegati lavorano per ciascun dipartimento. Un impiegato risulta non ancora assegnato ad alcun dipartimento (NULL
).
Dopo aver raggruppato i dati possiamo anche ordinarli a nostro piacimento mediante la clausola ORDER BY
.
Filtrare i risultati con HAVING
Dopo aver raggruppato i dati possiamo ulteriormente applicare un filtro mediante la condizione imposta con la clausola HAVING
.
Abbiamo visto in quasi tutte le lezioni precedenti che per filtrare i dati si applica la condizione imposta con la clausola WHERE
. Purtroppo le funzioni di gruppo non possono essere utilizzate con la clausola WHERE
, ma solamente con la clausola HAVING
.
Una query può contenere entrambe le clausole WHERE
e HAVING
. In questa situazione Oracle applicherà la condizione imposta con la clausola WHERE prima del raggruppamento dei dati, quindi applicherà la condizione imposta con la clausola HAVING
ma solamente dopo aver eseguito il raggruppamento dei dati.
Esempio
SQL> SELECT department_id AS ID, 2 COUNT (*) AS Count_Dept 3 FROM employees 4 GROUP BY department_id 5 HAVING (department_id >= 80);
Nell'esempio abbiamo raggruppato gli impiegati per id del dipartimento, ovvero calcolato quanti impiegati ha ciascun dipartimento, ma visualizzato solamente gli id del dipartimento con valore maggiore o uguale a 80.
Esempio di output su console
SQL> SELECT department_id AS ID, 2 COUNT (*) AS Count_Dept 3 FROM employees 4 WHERE (salary > 5000) 5 GROUP BY department_id 6 HAVING (department_id >= 40);
Nell'esempio abbiamo filtrato gli impiegati selezionando solamente quelli il cui salario è superiore a 5000. Dei rimanenti impiegati abbiamo quindi calcolato quanti lavorano in ciascun dipartimento raggruppandoli per id del dipartimento. Infine abbiamo visualizzato solamente i dipartimenti il cui id è maggiore o uguale a 40.
Esempio
SQL> SELECT * FROM departments HAVING (department_id > 230); HAVING department_id > 230
In questo esempio abbiamo visto come la clausola HAVING non può essere assolutamente utilizzata per imporre una condizione di filtro nella query senza aver prima attuato un raggruppamento di dati con la clausola GROUP BY
.