Che cos'è la clausola Group by SQL?
La clausola GROUP BY è un comando SQL utilizzato per raggruppare righe con gli stessi valori . La clausola GROUP BY viene utilizzata nell'istruzione SELECT. Facoltativamente, viene utilizzato insieme a funzioni aggregate per produrre report di riepilogo dal database.
Questo è quello che fa, riassumendo i dati dal database.
Le query che contengono la clausola GROUP BY sono chiamate query raggruppate e restituiscono solo una singola riga per ogni elemento raggruppato.
Sintassi SQL GROUP BY
Ora che sappiamo cos'è la clausola SQL GROUP BY, esaminiamo la sintassi per un gruppo di base per query.
SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];
QUI
- "Istruzioni SELECT ..." è la query del comando SQL SELECT standard.
- " GROUP BY nome_colonna1" è la clausola che esegue il raggruppamento in base a nome_colonna1.
- "[, nome_colonna2,…]" è facoltativo; rappresenta altri nomi di colonna quando il raggruppamento viene eseguito su più di una colonna.
- "[HAVING condition]" è facoltativo; viene utilizzato per limitare le righe interessate dalla clausola GROUP BY. È simile alla clausola WHERE.
Raggruppamento utilizzando una singola colonna
Per aiutare a comprendere l'effetto della clausola SQL Group By, eseguiamo una semplice query che restituisca tutte le voci di genere dalla tabella dei membri.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Supponiamo di voler ottenere i valori univoci per i sessi. Possiamo usare una seguente query:
SELECT `gender` FROM `members` GROUP BY `gender`;
L'esecuzione dello script precedente nel workbench MySQL su Myflixdb ci dà i seguenti risultati.
gender |
---|
Female |
Male |
Notare che sono stati restituiti solo due risultati. Questo perché abbiamo solo due tipi di sesso maschile e femminile. La clausola GROUP BY in SQL raggruppava tutti i membri "Male" e restituiva solo una singola riga. Ha fatto lo stesso con i membri "Female".
Raggruppamento utilizzando più colonne
Supponiamo di voler ottenere un elenco di film category_id e gli anni corrispondenti in cui sono stati rilasciati.
Osserviamo l'output di questa semplice query
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
Il risultato sopra ha molti duplicati.
Eseguiamo la stessa query usando group by in SQL -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
L'esecuzione dello script sopra in MySQL workbench su myflixdb ci dà i seguenti risultati mostrati di seguito.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
La clausola GROUP BY opera sia sull'id della categoria che sull'anno rilasciato per identificare le righe univoche nel nostro esempio precedente.
Se l'ID categoria è lo stesso ma l'anno rilasciato è diverso, una riga viene trattata come una riga unica.Se l'ID categoria e l'anno rilasciato sono gli stessi per più di una riga, viene considerata un duplicato e solo una riga è mostrato.
Funzioni di raggruppamento e aggregazione
Supponiamo di volere il numero totale di maschi e femmine nel nostro database. Possiamo usare il seguente script mostrato di seguito per farlo.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
L'esecuzione dello script precedente nel workbench MySQL su myflixdb ci dà i seguenti risultati.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
I risultati mostrati di seguito sono raggruppati per ogni valore di sesso univoco pubblicato e il numero di righe raggruppate viene conteggiato utilizzando la funzione di aggregazione COUNT.
Limitazione dei risultati della query utilizzando la clausola HAVING
Non è sempre che vorremo eseguire raggruppamenti su tutti i dati in una determinata tabella. Ci saranno momenti in cui vorremo limitare i nostri risultati a un determinato criterio. In questi casi, possiamo utilizzare la clausola HAVING
Supponiamo di voler conoscere tutti gli anni di rilascio per l'ID categoria di film 8. Useremmo il seguente script per ottenere i nostri risultati.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
L'esecuzione dello script sopra in MySQL workbench su Myflixdb ci dà i seguenti risultati mostrati di seguito.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Nota che solo i film con ID categoria 8 sono stati interessati dalla nostra clausola GROUP BY.
Sommario
- La clausola SQL GROUP BY viene utilizzata per raggruppare righe con gli stessi valori.
- La clausola GROUP BY viene utilizzata insieme all'istruzione SQL SELECT.
- L'istruzione SELECT utilizzata nella clausola GROUP BY può essere utilizzata solo per contenere nomi di colonne, funzioni aggregate, costanti ed espressioni.
- La clausola SQL having viene utilizzata per limitare i risultati restituiti dalla clausola GROUP BY.
- La clausola MYSQL GROUP BY viene utilizzata per raccogliere dati da più record e set di record restituiti da una o più colonne.