Immagina di lavorare con migliaia di righe di dati — come ci tiri fuori qualcosa di sensato? Qui entra in gioco l’operatore GROUP BY — il vero direttore d’orchestra di SQL. Prende dati sparsi e li trasforma in una melodia chiara: conta, raggruppa, fa i totali. Vuoi sapere quanti ordini ha fatto ogni cliente, quanti studenti ci sono in ogni corso o come sono distribuiti gli stipendi nei reparti? Tutto questo è lavoro per GROUP BY. Oggi vediamo come diventare amici di questo strumento e spremere il massimo dalle tue tabelle.
Il raggruppamento è il processo di unire le righe che hanno gli stessi valori in una o più colonne in gruppi logici. Ti permette di applicare funzioni di aggregazione separatamente a ogni gruppo.
Immagina di avere una tabella di dipendenti e vuoi sapere lo stipendio medio per ogni reparto. Un reparto — un gruppo. SQL usa GROUP BY per dividere la tabella dei dipendenti in gruppi per reparto, poi applica AVG() a ogni gruppo.
Sintassi di GROUP BY
La regola principale quando usi il raggruppamento in SQL: se usi GROUP BY, ogni colonna che non fa parte di una funzione di aggregazione deve essere indicata in GROUP BY.
Sintassi:
SELECT colonna1,
funzione_aggregata(colonna2)
FROM tabella
GROUP BY colonna1;
Passaggi:
- Indica la colonna su cui vuoi raggruppare i dati in
GROUP BY. - Usa funzioni di aggregazione per calcolare valori nei gruppi.
- Tutte le colonne in
SELECTche non sono dentro funzioni di aggregazione devono essere elencate inGROUP BY. Sì, SQL è pignolo su questo, e se ti dimentichi, ti becchi un errore.
Esempio: Raggruppare studenti per facoltà
Supponiamo di avere una tabella students che contiene dati sugli studenti:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Ora vogliamo sapere la media dei voti (GPA) per ogni facoltà. Scriviamo una query con GROUP BY:
SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Risultato:
| faculty | avg_gpa |
|---|---|
| ComputerSci | 3.9 |
| Math | 3.7 |
| Physics | 3.7 |
SQL prima divide i dati in gruppi in base al valore della colonna faculty, poi applica la funzione AVG() a ogni gruppo.
Particolarità di GROUP BY
- Requisiti sulle colonne in
SELECT
SQL vuole che tutte le colonne che metti in SELECT ma non usi in funzioni di aggregazione (tipo SUM(), COUNT()) siano nominate in GROUP BY. Questo perché senza raggruppamento SQL non sa che valori mostrare.
Prova a lanciare questa query e ti becchi un errore:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;
Errore: la colonna name non è indicata in GROUP BY. Per sistemare, aggiungi name a GROUP BY:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;
Ma così raggruppi i dati a livello di singolo studente — non proprio quello che volevamo all’inizio.
- Raggruppare per più colonne
Puoi raggruppare i dati non solo per una colonna, ma anche per più colonne. Per esempio, oltre alle facoltà vogliamo raggruppare gli studenti anche per nome. Basta aggiungere la seconda colonna in GROUP BY:
SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;
Tabella iniziale:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Risultato:
| faculty | name | avg_gpa |
|---|---|---|
| ComputerSci | Alex Lin | 3.8 |
| ComputerSci | Anna Song | 4.0 |
| Math | Maria Chi | 3.5 |
| Math | Otto Art | 3.9 |
| Physics | Liam Park | 3.7 |
- Raggruppamento con più funzioni di aggregazione
Non limitarti a una sola funzione! Per esempio, vogliamo contare quanti studenti ci sono per facoltà e calcolare la media dei voti:
SELECT faculty,
COUNT(*) AS student_count,
AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Tabella originale:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Risultato:
| faculty | student_count | avg_gpa |
|---|---|---|
| ComputerSci | 2 | 3.9 |
| Math | 2 | 3.7 |
| Physics | 1 | 3.7 |
Particolarità del raggruppamento in SQL: cosa puoi e non puoi selezionare
Scrivere query con raggruppamento è facile, ma probabilmente metà delle tue query non funzioneranno. Il raggruppamento non funziona proprio come siamo abituati a pensare.
Se nella tua query SQL c’è GROUP BY, pensa a tutte le colonne del risultato come espressioni calcolate. Le colonne in SELECT possono essere solo di due tipi:
- calcolate da funzioni di aggregazione sulle colonne del gruppo.
- prese da GROUP BY — cioè quelle su cui hai fatto il raggruppamento.
Se fai una query GROUP BY sulla tabella degli studenti, nella tabella risultante non puoi avere studenti specifici! Puoi avere l’altezza media, il peso medio, il voto medio. Questo codice non funziona:
SELECT faculty, name
FROM students
GROUP BY faculty;
Vediamo perché.
L’operatore GROUP BY faculty divide gli studenti della tabella students in gruppi con lo stesso faculty per ogni gruppo. Visto che tutti gli studenti del gruppo hanno lo stesso faculty, si può dire che l’attributo faculty appartiene al gruppo di studenti. Ma name è diverso per ogni studente. Quindi il gruppo non ha un attributo name.
L’operatore GROUP BY faculty, gender divide gli studenti della tabella students in gruppi con lo stesso faculty e gender per ogni gruppo. Quindi tutti gli studenti di ogni gruppo avranno lo stesso faculty e gender. Si può dire che il gruppo di studenti ha gli attributi faculty e gender. Ma il gruppo non ha comunque un unico name.
Così si può scrivere:
SELECT faculty, gender
FROM students
GROUP BY faculty, gender;
Si può anche così:
SELECT
faculty,
gender,
AVG(age) as group_avg_age, -- Valore calcolato sui valori age del gruppo di studenti
MAX(high) as group_high -- Valore calcolato sui valori high del gruppo di studenti
FROM students
GROUP BY faculty, gender;
Ma non puoi semplicemente usare age e high in SELECT in questo caso.
Errori tipici con GROUP BY
Quando inizi a scrivere query con GROUP BY, ecco qualche trappola in cui potresti cadere:
Non tutte le colonne sono in
SELECT. Ricorda, ogni colonna che non è un aggregato deve essere inGROUP BY. Altrimenti SQL non sa come mostrarla.Raggruppamento su
NULL. I valoriNULLsono considerati un gruppo a parte. Se nella tua colonna c’èNULL, SQL creerà un gruppo perNULL.Gruppi inutilmente dettagliati. Se per sbaglio aggiungi troppe colonne in
GROUP BY, puoi ottenere risultati troppo dettagliati, difficili da analizzare.
Ora sai come raggruppare i dati in modo efficace con GROUP BY. È uno degli strumenti più potenti in SQL, che ti permette di lavorare facilmente con dati aggregati e creare report strutturati. Dopo andremo ancora più a fondo nella magia del raggruppamento e vedremo come aggiungere filtri extra con HAVING.
GO TO FULL VERSION