SQL GROUP BY og HAVING Klausul med eksempler
Hvad er SQL Group by Clause?
GROUP BY-sætningen er en SQL-kommando, der bruges til grupperækker, der har samme værdier. GROUP BY-sætningen bruges i SELECT-sætningen. Valgfrit bruges det sammen med aggregerede funktioner til at producere sammenfattende rapporter fra databasen.
Det er hvad det gør, opsummere data fra databasen.
De forespørgsler, der indeholder GROUP BY-sætningen, kaldes grupperede forespørgsler og returnerer kun en enkelt række for hvert grupperet element.
SQL GROUP BY Syntaks
Nu hvor vi ved, hvad SQL GROUP BY-sætningen er, lad os se på syntaksen for en grundlæggende gruppe for forespørgsel.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
HER
- "SELECT-sætninger..." er standard SQL SELECT-kommandoforespørgsel.
- "GROUP BY kolonnenavn1” er klausulen, der udfører grupperingen baseret på kolonnenavn1.
- "[,kolonnenavn2,...]" er valgfrit; repræsenterer andre kolonnenavne, når grupperingen er udført på mere end én kolonne.
- "[HAVING tilstand]" er valgfrit; det bruges til at begrænse rækkerne, der påvirkes af GROUP BY-sætningen. Det ligner WHERE-klausul.
Gruppering ved hjælp af en Single Column
For at hjælpe med at forstå effekten af SQL Group By-sætning, lad os udføre en simpel forespørgsel, der returnerer alle kønsindtastninger fra medlemstabellen.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Antag, at vi ønsker at få de unikke værdier for køn. Vi kan bruge en følgende forespørgsel -
SELECT `gender` FROM `members` GROUP BY `gender`;
Udførelse af ovenstående script i MySQL arbejdsbord mod Myflixdb giver os følgende resultater.
gender |
---|
Female |
Male |
Bemærk kun to resultater er blevet returneret. Det skyldes, at vi kun har to kønstyper Mand og Kvinde. GROUP BY-sætningen i SQL grupperede alle "Mand"-medlemmerne sammen og returnerede kun en enkelt række for det. Det gjorde det samme med de "Kvindelige" medlemmer.
Gruppering vha flere kolonner
Antag, at vi ønsker at få en liste over filmkategori_id og tilsvarende år, hvor de blev udgivet.
Lad os observere outputtet af denne simple forespørgsel
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 |
Ovenstående resultat har mange dubletter.
Lad os udføre den samme forespørgsel ved at bruge group by i SQL -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Udførelse af ovenstående script i MySQL workbench mod myflixdb giver os følgende resultater vist nedenfor.
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 fungerer på både kategori-id og år, der er frigivet for at identificere enestående rækker i vores eksempel ovenfor.
Hvis kategori-id'et er det samme, men det frigivne år er forskelligt, behandles en række som en unik. Hvis kategori-id'et og det frigivne år er det samme for mere end én række, betragtes den som en dublet og kun én række er vist.
Gruppering og samlede funktioner
Antag, at vi ønsker det samlede antal hanner og hunner i vores database. Vi kan bruge følgende script vist nedenfor til at gøre det.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Udførelse af ovenstående script i MySQL workbench mod myflixdb giver os følgende resultater.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Resultaterne vist nedenfor er grupperet efter hver unikke kønsværdi, der er postet, og antallet af grupperede rækker tælles ved hjælp af COUNT aggregatfunktionen.
Begrænsning af forespørgselsresultater ved hjælp af SOM klausul
Det er ikke altid, at vi ønsker at udføre grupperinger på alle data i en given tabel. Der vil være tidspunkter, hvor vi ønsker at begrænse vores resultater til bestemte givne kriterier. I sådanne tilfælde kan vi bruge HAVING-klausulen
Antag, at vi ønsker at kende alle udgivelsesårene for filmkategori id 8. Vi ville bruge følgende script til at opnå vores resultater.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Udførelse af ovenstående script i MySQL workbench mod Myflixdb giver os følgende resultater vist nedenfor.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Bemærk, at kun film med kategori-id 8 er blevet påvirket af vores GROUP BY-klausul.
Resumé
- GROUP BY-klausulen SQL bruges til at gruppere rækker med samme værdier.
- GROUP BY-klausulen bruges sammen med SQL SELECT-sætning.
- SELECT-sætningen brugt i GROUP BY-sætningen kan kun bruges indeholde kolonnenavne, aggregerede funktioner, konstanter og udtryk.
- SQL Having-klausul bruges til at begrænse de resultater, der returneres af GROUP BY-sætningen.
- MYSQL GROUP BY-klausul bruges til at indsamle data fra flere poster og returnerede post sat af en eller flere kolonner.