CodeGym /Corsi /SQL SELF /Raggruppamento dei dati (GROUP BY): sintassi e struttura

Raggruppamento dei dati (GROUP BY): sintassi e struttura

SQL SELF
Livello 8 , Lezione 0
Disponibile

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:

  1. Indica la colonna su cui vuoi raggruppare i dati in GROUP BY.
  2. Usa funzioni di aggregazione per calcolare valori nei gruppi.
  3. Tutte le colonne in SELECT che non sono dentro funzioni di aggregazione devono essere elencate in GROUP 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

  1. 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.

  1. 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
  1. 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:

  1. Non tutte le colonne sono in SELECT. Ricorda, ogni colonna che non è un aggregato deve essere in GROUP BY. Altrimenti SQL non sa come mostrarla.

  2. Raggruppamento su NULL. I valori NULL sono considerati un gruppo a parte. Se nella tua colonna c’è NULL, SQL creerà un gruppo per NULL.

  3. 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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION