SQL GROUP BY e clausola HAVING con esempi
Qual è la clausola SQL Group by?
La clausola GROUP BY è un comando SQL utilizzato per raggruppare righe con gli stessi valori. La clausola GROUP BY viene utilizzata nell’istruzione SELECT. Opzionalmente viene utilizzato in combinazione con 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.,
SQL GROUP BY Syntax
Ora che sappiamo cos’è la clausola SQL GROUP BY, diamo un’occhiata alla sintassi per una query di base group by.
SELECT statements... GROUP BY column_name1 ;
QUI
- “SELEZIONARE le istruzioni…”è la query di comando SQL SELECT standard.
- “GROUP BY column_name1” è la clausola che esegue il raggruppamento in base a column_name1.
- “” è facoltativo; rappresenta altri nomi di colonne quando il raggruppamento viene eseguito su più colonne.
- “” è facoltativo; viene utilizzato per limitare le righe interessate dalla clausola GROUP BY., È simile alla clausola WHERE.
Raggruppamento utilizzando una singola colonna
Al fine di aiutare a capire l’effetto di SQL Group By clausola, eseguiamo una semplice query che restituisce tutte le voci di genere dalla tabella membri.
SELECT `gender` FROM `members` ;
gender Female
Female
Male
Female
Male
Male
Male
Male
Male
Supponiamo di voler ottenere i valori univoci per i generi. Possiamo usare una seguente query-
SELECT `gender` FROM `members` GROUP BY `gender`;
L’esecuzione dello script sopra in MySQL workbench contro Myflixdb ci dà i seguenti risultati.,
gender Female
Male
Nota sono stati restituiti solo due risultati. Questo perché abbiamo solo due tipi di genere Maschile e femminile. La clausola GROUP BY in SQL raggruppava tutti i membri “Maschi” e restituiva solo una singola riga per esso. Ha fatto lo stesso con i membri” Femminili”.
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 di cui 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 contro 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 categoria che sull’anno rilasciato per identificare le righe univoche nel nostro esempio precedente.,
Se l’ID della categoria è lo stesso ma l’anno rilasciato è diverso, una riga viene trattata come unica .Se l’ID della categoria e l’anno rilasciato sono gli stessi per più di una riga, viene considerato un duplicato e viene visualizzata solo una riga.
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 in MySQL workbench contro 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 genere univoco pubblicato e il numero di righe raggruppate viene conteggiato utilizzando la funzione COUNT aggregate.
Limitare i risultati delle 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 determinati criteri. In questi casi , possiamo usare la clausola HAVING
Supponiamo di voler conoscere tutti gli anni di rilascio per la categoria di film id 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 contro 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 solo i film con categoria id 8 sono stati influenzati dalla nostra clausola GROUP BY.
Riepilogo
- 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.
- MYSQL GROUP BY Clausola viene utilizzato per raccogliere dati da più record e record restituito impostato da una o più colonne.