Vad är SQL Group by Clause?
GROUP BY-satsen är ett SQL-kommando som används för att gruppera rader som har samma värden . GROUP BY-satsen används i SELECT-satsen. Valfritt används den tillsammans med aggregerade funktioner för att producera sammanfattande rapporter från databasen.
Det är vad den gör, sammanfattar 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 basgrupp efter fråga.
SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];
HÄR
- "SELECT-uttalanden ..." är standard SQL SELECT-kommandofrågan.
- " GROUP BY column_name1" är den klausul som utför grupperingen baserat på column_name1.
- "[, column_name2,…]" är valfritt; representerar andra kolumnnamn när grupperingen görs i mer än en kolumn.
- "[HAVING condition]" är valfritt; den används för att begränsa de rader som påverkas av GROUP BY-klausulen. Det liknar WHERE-klausulen.
Gruppera med en enda kolumn
För att hjälpa till att förstå effekten av SQL Group By-satsen, låt oss utfö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 |
Antag 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`;
Att utföra ovanstående skript i MySQL-arbetsbänken 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-klausulen i SQL grupperade alla "Manliga" medlemmar tillsammans och returnerade bara en enda rad för den. Det gjorde samma sak med "kvinnliga" medlemmar.
Gruppering med flera kolumner
Antag att vi vill få en lista över filmkategori-id och motsvarande år då de släpptes.
Låt oss följa 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 utfö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`;
Att utföra ovanstående skript i MySQL-arbetsbänken 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-klausulen fungerar på både kategori-id och år som släpptes för att identifiera unika rader i vårt ovanstående exempel.
Om kategori-id är detsamma men året som släpps är annorlunda behandlas en rad som en unik. Om kategori-id och utgivningsår är detsamma för mer än en rad, anses det vara en duplikat och endast en rad visas.
Gruppering och aggregerade funktioner
Antag 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`;
Att köra ovanstående skript i MySQL-arbetsbänken mot myflixdb ger oss följande resultat.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Resultaten som visas nedan grupperas efter varje unikt könsvärde som läggs upp och antalet grupperade rader räknas med funktionen ANTAL aggregering.
Begränsa sökresultat med HAVING- klausulen
Det är inte alltid vi vill utföra grupperingar av all data i en given tabell. Det kommer att finnas tillfällen då vi vill begränsa våra resultat till vissa givna kriterier. I sådana fall kan vi använda HAVING-klausulen
Antag att vi vill veta alla utgivningså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;
Att utföra ovanstående skript i MySQL-arbetsbänken 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-klausul SQL används för att gruppera rader med samma värden.
- GROUP BY-klausulen används tillsammans med SQL SELECT-satsen.
- SELECT-satsen som används i GROUP BY-satsen kan endast användas innehåller kolumnnamn, aggregerade funktioner, konstanter och uttryck.
- SQL Having-klausul används för att begränsa resultaten som returneras av GROUP BY-klausulen.
- MYSQL GROUP BY-klausul används för att samla in data från flera poster och returnerade poster med en eller flera kolumner.