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.