- Introduzione: Panoramica di GROUP BY
Quando si gestiscono grandi set di dati in un database, uno strumento potente per aggregare e organizzare i dati in modo efficiente è la clausola GROUP BY. GROUP BY raggruppa i dati in base a una colonna specifica ed è usato quando si eseguono aggregazioni per ciascun gruppo. Ad esempio, se si desidera calcolare le vendite totali per ogni categoria di prodotto, questa clausola semplifica il recupero dei dati desiderati.
Utilizzando la clausola GROUP BY, è possibile organizzare i dati in un formato facile da leggere e applicare funzioni aggregate (SUM, COUNT, AVG, ecc.) per un’analisi più approfondita.
- 1 2. Utilizzo di base di GROUP BY
- 2 3. Combinare GROUP BY con le Funzioni Aggregate
- 3 4. Filtrare con la clausola HAVING
- 4 5. Utilizzare GROUP BY con ORDER BY
- 5 6. GROUP BY avanzato: WITH ROLLUP
- 6 7. Differenza tra GROUP BY e DISTINCT
- 7 8. Ottimizzare le prestazioni di GROUP BY in MySQL
- 8 9. Riepilogo: Uso efficace di GROUP BY
2. Utilizzo di base di GROUP BY
La clausola GROUP BY raggruppa i dati in base alla colonna specificata ed esegue l’aggregazione per ciascun gruppo. Questo rende semplice generare riepiloghi e statistiche basati su categorie o condizioni.
Sintassi di base
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name;
Esempio
Per calcolare le vendite totali per categoria di prodotto, è possibile scrivere la query come segue:
SELECT product_category, SUM(sales_amount)
FROM sales
GROUP BY product_category;
Questa query calcola le vendite totali per ogni categoria di prodotto.
Risultato dell’esempio
product_category | SUM(sales_amount) |
|---|---|
Electronics | 100,000 |
Food | 50,000 |
Clothing | 75,000 |

3. Combinare GROUP BY con le Funzioni Aggregate
Combinando GROUP BY con le funzioni aggregate, è possibile raggruppare i dati e calcolare statistiche per ogni gruppo. Le funzioni aggregate più comuni usate in MySQL includono:
- SUM() : Calcola la somma dei dati numerici.
- COUNT() : Conta il numero di righe.
- AVG() : Calcola la media dei dati numerici.
- MAX() : Recupera il valore massimo.
- MIN() : Recupera il valore minimo.
Query di esempio
Per ottenere sia le vendite totali sia il conteggio delle vendite per categoria di prodotto:
SELECT product_category, SUM(sales_amount), COUNT(*)
FROM sales
GROUP BY product_category;
Questa query recupera sia le vendite totali sia il numero di vendite per ogni product_category.
4. Filtrare con la clausola HAVING
La clausola HAVING applica condizioni ai dati raggruppati creati con GROUP BY. A differenza della clausola WHERE, che filtra le righe prima dell’aggregazione, HAVING filtra i gruppi in base ai risultati delle funzioni aggregate.
Query di esempio
Ad esempio, per estrarre solo le categorie con vendite totali superiori a 1000:
SELECT product_category, SUM(sales_amount)
FROM sales
GROUP BY product_category
HAVING SUM(sales_amount) > 1000;
Questa query restituisce solo le categorie di prodotto con vendite totali superiori a 1000.

5. Utilizzare GROUP BY con ORDER BY
Dopo aver raggruppato i dati con GROUP BY, è possibile ordinare i risultati usando la clausola ORDER BY. ORDER BY ordina i risultati in ordine ascendente (ASC) o discendente (DESC) in base ai valori delle colonne specificate.
Query di esempio
Per ordinare le categorie di prodotto per vendite totali in ordine discendente:
SELECT product_category, SUM(sales_amount)
FROM sales
GROUP BY product_category
ORDER BY SUM(sales_amount) DESC;
Questa query mostra le categorie di prodotto ordinate dalle vendite più alte alle più basse.
6. GROUP BY avanzato: WITH ROLLUP
WITH ROLLUP aggiunge una riga di riepilogo che mostra i totali complessivi oltre ai totali di gruppo. Questo è particolarmente utile per report e riepiloghi.
Query di esempio
Per mostrare sia i totali delle vendite per città sia il totale complessivo:
SELECT city, SUM(sales_amount)
FROM sales
GROUP BY city WITH ROLLUP;
Questa query mostra le vendite totali per ogni città più il totale complessivo.

7. Differenza tra GROUP BY e DISTINCT
DISTINCT e GROUP BY aiutano entrambi a organizzare i dati, ma hanno scopi diversi. DISTINCT rimuove le righe duplicate, mentre GROUP BY raggruppa i dati ed esegue aggregazioni.
Confronto delle query di esempio
Usare DISTINCT per ottenere un elenco unico di categorie di prodotto:
SELECT DISTINCT product_category
FROM sales;
Usare GROUP BY per ottenere il conteggio delle vendite per categoria di prodotto:
SELECT product_category, COUNT(*)
FROM sales
GROUP BY product_category;
DISTINCT rimuove solo i duplicati, mentre GROUP BY esegue l’aggregazione.
8. Ottimizzare le prestazioni di GROUP BY in MySQL
Quando si lavora con grandi set di dati, ottimizzare le prestazioni di GROUP BY è fondamentale. Configurazioni corrette e l’ottimizzazione delle query possono migliorare significativamente l’efficienza.
1. Utilizzare gli indici
Aggiungere indici alle colonne utilizzate in GROUP BY migliora la velocità di ricerca e di raggruppamento.
CREATE INDEX idx_category ON sales(product_category);
Un indicizzazione adeguata può migliorare notevolmente le prestazioni.
2. Regolare le impostazioni di memoria
Ottimizzare le impostazioni di memoria come sort_buffer_size e tmp_table_size migliora le prestazioni nella gestione di grandi set di dati.
SET GLOBAL sort_buffer_size = 2M;
SET GLOBAL tmp_table_size = 64M;
Aumentare la memoria riduce le scritture su disco e accorcia il tempo di esecuzione delle query.
3. Semplificare le query
Le query complesse rallentano le prestazioni. Evita JOIN e sottoquery eccessive. Rimuovi colonne e condizioni non necessarie per migliorare la velocità.
4. Funzionalità specifiche
In MySQL 8.0 e successive, è disponibile il raggruppamento basato su hash oltre al raggruppamento basato su ordinamento. Il raggruppamento basato su hash è più veloce per grandi set di dati.
SET optimizer_switch = 'hash_join=on';
5. Utilizzare la cache query
In MySQL 5.7 e versioni precedenti, abilitare la cache delle query migliora le prestazioni per query ripetute.
SET GLOBAL query_cache_size = 16M;
SET GLOBAL query_cache_type = 1;
6. Considerare il partizionamento
La funzionalità di partizionamento di MySQL divide i grandi database in segmenti più piccoli, accelerando l’esecuzione delle query.
ALTER TABLE sales PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p0 VALUES LESS THAN (2021),
PARTITION p1 VALUES LESS THAN (2022),
PARTITION p2 VALUES LESS THAN (2023)
);
9. Riepilogo: Uso efficace di GROUP BY
La clausola GROUP BY è uno strumento SQL essenziale per raggruppare e aggregare i dati. In questo articolo, hai appreso le basi di GROUP BY, come usarlo con HAVING e ORDER BY, e funzionalità avanzate come WITH ROLLUP. Hai anche esplorato ottimizzazioni delle prestazioni usando indici, impostazioni di memoria e funzionalità specifiche della versione come il raggruppamento basato su hash in MySQL 8.0.
Inoltre, abbiamo trattato funzionalità avanzate di MySQL come la cache delle query e il partizionamento per gestire i grandi set di dati in modo più efficiente. Applicando correttamente queste tecniche, puoi migliorare le prestazioni dell’analisi e della generazione di report nei tuoi progetti.


