Loading...
SQL

Uso del GROUP BY e dell’HAVING in SQL

La clausola GROUP BY di SQL è utilizzata nelle operazioni di SELECT allo scopo di raggruppare i valori identici presenti in una o più colonne. In pratica serve per evitare dei doppioni inutili nella tabella risultato della query.

La clausola GROUP BY è un accessorio facoltativo di SELECT e va inserita dopo FROM o WHERE (se presente).

SELECT <elenco campi>
FROM <tabella>
WHERE <condizione>
GROUP BY <elenco campi>

In altre parole, la clausola GROUP BY produce un risultato, nei casi più semplici, analogo a SELECT DISTINCT. Ad esempio, supponendo di voler mostrare un elenco dei diversi cognomi dei contatti presenti in una elenco di alunni, potremmo scrivere la query seguente:

SELECT cognome
FROM alunni
GROUP BY cognome
ORDER BY cognome ASC;

Il risultato di questa query è identico a quello che si otterebbe con:

SELECT DISTINCT cognome
FROM alunni
ORDER BY cognome ASC;

Il funzionamento di GROUP BY spesso va in congiunzione alla clausola HAVING la quale consente di impostare un filtro sui valori raggruppati.
Supponiamo, ad esempio, di dover lavorare sulla tabella “ordini” di un ipotetico sito di e-commerce così strutturata:

ORDINI (id_cliente,prodotto,prezzo)

Supponiamo ora di voler estrarre da questa tabella l’elenco dei clienti che hanno speso più di 2.000 Euro:

SELECT id_cliente, SUM(prezzo) AS spesa
FROM ordini
GROUP BY id_cliente
HAVING spesa >= 2000;

Naturalmente è possibile realizzare con HAVING anche condizioni complesse utilizzando gli operatori AND e OR tipici della clausola WHERE, ad esempio possiamo decidere di visualizzare solo i clienti che hanno speso almeno 2500 euro oppure hanno effettuato almeno 5 acquisti:

SELECT id_cliente, SUM(id) AS acquisti, SUM(prezzo) AS spesa FROM ordini GROUP BY id_cliente HAVING spesa >= 25000 OR acquisti >= 5;

Altro esempio:

Dato il seguente schema relazionale:
 AUTORE(ID, NOME, COGNOME, Data-N, Nazionalità)
 LIBRO(ID_Libro,Titolo, Genere, Lingua, ID_autore*)

risolvere le seguenti query SQL:

1) Selezionare il COGNOME degli autori tedeschi di libri in italiano con argomento “filosofia” o “fisica”
 SELECT AUTORE.Cognome LIBRO.titolo
 FROM AUTORE, LIBRO
 WHERE AUTORE.ID=LIBRO.ID_Autore
 and A.Cognome=AL.Cognome
 and Nazionalita=“tedesca”
 and Lingua="italiano”
 and (Argomento=“filosofia” OR Argomento=“fisica”)
2) Selezionare quegli autori (selezionati in base al loro Nome e Cognome) che hanno più di 10 libri diversi
 SELECT Nome, Cognome
 FROM Autore, libro
 WHERE AUTORE.ID=LIBRO.ID_Autore
 GROUP BY Cognome, Nome
 HAVING COUNT(*) > 10