Clausola SQL GROUP BY e HAVING con esempi

Cos'è il gruppo SQL per clausola?

La clausola GROUP BY è un comando SQL utilizzato per raggruppare le righe che hanno gli stessi valori. La clausola GROUP BY viene utilizzata nell'istruzione SELECT. Facoltativamente viene utilizzato insieme alle funzioni aggregate per produrre report di riepilogo dal database.

Questo è ciò che fa, dati riassuntivi dalla banca dati.

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 di 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.
  • "RAGGRUPPA PER 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 al Dove la clausola.

Raggruppamento utilizzando a Colonna singola

Per comprendere l'effetto della clausola SQL Group By, eseguiamo una semplice query che restituisce 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 generi. Possiamo usare la seguente query:

SELECT `gender` FROM `members` GROUP BY `gender`;

Eseguendo lo script precedente in MySQL banco di lavoro rispetto a Myflixdb ci fornisce i seguenti risultati.

gender
Female
Male

Nota: sono stati restituiti solo due risultati. Questo perché abbiamo solo due tipi di genere: maschio e femmina. La clausola GROUP BY in SQL raggruppava insieme tutti i membri "maschili" e restituiva solo una singola riga. Ha fatto lo stesso con i membri “Femminili”.

Raggruppamento utilizzando più colonne

Supponiamo di voler ottenere un elenco dei film Category_ID e degli 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 utilizzando group by in SQL –

SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;

Eseguendo lo script precedente in MySQL workbench su myflixdb ci fornisce 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 rilasciati per l'identificazione unica righe nel nostro esempio sopra.

Se l'ID della categoria è lo stesso ma l'anno di rilascio è diverso, una riga viene considerata univoca. Se l'ID della categoria e l'anno di rilascio sono gli stessi per più di una riga, viene considerata un duplicato e solo una riga è mostrato.

Raggruppamento e funzioni aggregate

Supponiamo di volere il numero totale di maschi e femmine nel nostro database. Possiamo usare lo script seguente mostrato di seguito per farlo.

SELECT `gender`,COUNT(`membership_number`)  FROM `members` GROUP BY `gender`;

Eseguendo lo script precedente in MySQL workbench su myflixdb ci fornisce i seguenti risultati.

gender COUNT('membership_number')
Female 3
Male 5

I risultati mostrati di seguito sono raggruppati in base a ogni valore di genere univoco pubblicato e il numero di righe raggruppate viene conteggiato utilizzando la funzione di aggregazione COUNT.

Limitazione dei risultati delle query utilizzando il file VISTA clausola

Non sempre 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 uscita per la categoria di film con ID 8. Per ottenere i nostri risultati utilizzeremo il seguente script.

SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;

Eseguendo lo script precedente in MySQL workbench su Myflixdb ci fornisce 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

Tieni presente che solo i film con ID categoria 8 sono 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 a 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 Using 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.