SQL GROUP BY och HAVING Klausul med exempel

Vad är SQL Group by Clause?

GROUP BY-satsen är ett SQL-kommando som används för att grupprader som har samma värden. GROUP BY-satsen används i SELECT-satsen. Alternativt används den i kombination med aggregatfunktioner för att producera sammanfattande rapporter från databasen.

Det är vad det gör, sammanfatta data från databasen.

Frågorna som innehåller GROUP BY-satsen kallas grupperade frågor och returnerar bara en enda rad för varje grupperat objekt.

SQL GROUP BY Syntax

Nu när vi vet vad SQL GROUP BY-satsen är, låt oss titta på syntaxen för en grundläggande grupp för fråga.

SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];

HÄR

  • "SELECT-satser..." är standardfrågan för SQL SELECT-kommando.
  • "GRUPP AV kolumnnamn1” är satsen som utför grupperingen baserat på kolumnnamn1.
  • "[,kolumnnamn2,...]" är valfritt; representerar andra kolumnnamn när grupperingen görs på mer än en kolumn.
  • "[HAR villkor]" är valfritt; den används för att begränsa raderna som påverkas av GROUP BY-satsen. Det liknar VAR klausul.

Gruppering med hjälp av en enda kolumn

För att hjälpa oss förstå effekten av SQL Group By-satsen, låt oss köra en enkel fråga som returnerar alla könsposter från medlemstabellen.

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Anta att vi vill få de unika värdena för kön. Vi kan använda följande fråga -

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

Exekvera skriptet ovan i MySQL arbetsbänk mot Myflixdb ger oss följande resultat.

gender
Female
Male

Observera att endast två resultat har returnerats. Det beror på att vi bara har två könstyper Man och Kvinna. GROUP BY-satsen i SQL grupperade alla "Manliga"-medlemmar tillsammans och returnerade endast en enda rad för den. Det gjorde samma sak med de "kvinnliga" medlemmarna.

Gruppering med hjälp av flera kolumner

Anta att vi vill få en lista över filmkategori_id och motsvarande år då de släpptes.

Låt oss observera resultatet av denna enkla fråga

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

Ovanstående resultat har många dubbletter.

Låt oss köra samma fråga med hjälp av group by i SQL -

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

Exekvera skriptet ovan i MySQL arbetsbänk mot myflixdb ger oss följande resultat som visas nedan.

category_id year_released
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

GROUP BY-satsen fungerar på både kategori-id och år släppt för att identifiera unika rader i vårt exempel ovan.

Om kategori-id:t är detsamma men det år som släpptes är olika, behandlas en rad som en unik. Om kategori-id:t och året som släpptes är samma för mer än en rad, anses den vara en dubblett och endast en rad visas.

Gruppering och aggregerade funktioner

Anta att vi vill ha totalt antal män och kvinnor i vår databas. Vi kan använda följande skript som visas nedan för att göra det.

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

Exekvera skriptet ovan i MySQL arbetsbänk mot myflixdb ger oss följande resultat.

gender COUNT('membership_number')
Female 3
Male 5

Resultaten som visas nedan är grupperade efter varje unikt könsvärde som publiceras och antalet grupperade rader räknas med hjälp av COUNT aggregationsfunktionen.

Begränsa frågeresultat med hjälp av HAR klausul

Det är inte alltid vi kommer att vilja utföra grupperingar på all data i en given tabell. Det kommer att finnas tillfällen då vi kommer att vilja begränsa våra resultat till vissa givna kriterier. I sådana fall kan vi använda HAVING-satsen

Anta att vi vill veta alla släppår för filmkategori id 8. Vi skulle använda följande manus för att uppnå våra resultat.

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

Exekvera skriptet ovan i MySQL arbetsbänk mot Myflixdb ger oss följande resultat som visas nedan.

movie_id title director year_released category_id
9 Honey mooners John Schultz 2005 8
5 Daddy's Little Girls NULL 2007 8

Observera att endast filmer med kategori-id 8 har påverkats av vår GROUP BY-klausul.

Sammanfattning

  • GROUP BY-satsen SQL används för att gruppera rader med samma värden.
  • GROUP BY-klausulen används tillsammans med SQL SELECT-sats.
  • SELECT-satsen som används i GROUP BY-satsen kan endast användas innehålla kolumnnamn, aggregerade funktioner, konstanter och uttryck.
  • SQL Having Clause används för att begränsa resultaten som returneras av GROUP BY-satsen.
  • MYSQL GROUP BY-klausul används för att samla in data från flera poster och returnerade poster satta av en eller flera kolumner.