SQL GROUP BY og HAVING Klausul med eksempler
Hva er SQL Group by Clause?
GROUP BY-leddet er en SQL-kommando som brukes til grupperader som har samme verdier. GROUP BY-leddet brukes i SELECT-setningen. Eventuelt brukes den sammen med aggregerte funksjoner for å produsere sammendragsrapporter fra databasen.
Det er det den gjør, oppsummere data fra databasen.
Spørringene som inneholder GROUP BY-leddet kalles grupperte spørringer og returnerer bare en enkelt rad for hvert gruppert element.
SQL GROUP BY Syntaks
Nå som vi vet hva SQL GROUP BY-leddet er, la oss se på syntaksen for en grunnleggende gruppe etter spørring.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
HER
- "SELECT-setninger..." er standard SQL SELECT-kommandospørring.
- "GRUPPE AV kolonnenavn1” er leddet som utfører grupperingen basert på kolonnenavn1.
- "[,kolonnenavn2,...]" er valgfritt; representerer andre kolonnenavn når grupperingen er utført på mer enn én kolonne.
- "[HAR tilstand]" er valgfritt; den brukes til å begrense radene som påvirkes av GROUP BY-leddet. Det ligner på HVOR klausul.
Gruppering ved hjelp av en enkelt~~POS=TRUNC kolonne
For å hjelpe til med å forstå effekten av SQL Group By-klausul, la oss kjøre en enkel spørring som returnerer alle kjønnsoppføringene fra medlemstabellen.
SELECT `gender` FROM `members` ;
| gender |
|---|
| Female |
| Female |
| Male |
| Female |
| Male |
| Male |
| Male |
| Male |
| Male |
Anta at vi ønsker å få de unike verdiene for kjønn. Vi kan bruke følgende spørring –
SELECT `gender` FROM `members` GROUP BY `gender`;
Utfører skriptet ovenfor i MySQL arbeidsbenk mot Myflixdb gir oss følgende resultater.
| gender |
|---|
| Female |
| Male |
Merk at kun to resultater har blitt returnert. Dette er fordi vi kun har to kjønnstyper Mann og Kvinne. GROUP BY-leddet i SQL grupperte alle "Mannlige"-medlemmene sammen og returnerte bare en enkelt rad for det. Det gjorde det samme med de "kvinnelige" medlemmene.
Gruppering ved hjelp av flere kolonner
Anta at vi ønsker å få en liste over filmkategori_id og tilsvarende år da de ble utgitt.
La oss se resultatet av denne enkle spørringen
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 |
Resultatet ovenfor har mange duplikater.
La oss utføre den samme spørringen ved å bruke group by i SQL –
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Utfører skriptet ovenfor i MySQL arbeidsbenk mot myflixdb gir oss 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 opererer på både kategori-ID og år utgitt for å identifisere unik rader i eksemplet ovenfor.
Hvis kategori-ID-en er den samme, men utgivelsesåret er forskjellig, behandles en rad som en unik. Hvis kategori-ID-en og utgivelsesåret er den samme for mer enn én rad, regnes den som en duplikat og bare én rad vises.
Gruppering og aggregerte funksjoner
Anta at vi vil ha totalt antall hanner og kvinner i databasen vår. Vi kan bruke følgende skript vist nedenfor for å gjøre det.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Utfører skriptet ovenfor i MySQL arbeidsbenk mot myflixdb gir oss følgende resultater.
| gender | COUNT('membership_number') |
|---|---|
| Female | 3 |
| Male | 5 |
Resultatene som vises nedenfor er gruppert etter hver unike kjønnsverdi som legges ut, og antall grupperte rader telles ved hjelp av COUNT aggregatfunksjonen.
Begrensning av søkeresultater ved å bruke HAR klausul
Det er ikke alltid vi ønsker å utføre grupperinger på alle dataene i en gitt tabell. Det vil være tider når vi vil ønske å begrense resultatene våre til et gitt kriterium. I slike tilfeller kan vi bruke HAVING-klausulen
Anta at vi ønsker å vite alle utgivelsesårene for filmkategori id 8. Vi bruker følgende manus for å oppnå resultatene våre.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Utfører skriptet ovenfor i MySQL arbeidsbenk mot Myflixdb gir oss 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 |
Vær oppmerksom på at bare filmer med kategori-id 8 har blitt påvirket av vår GROUP BY-klausul.
Sammendrag
- GROUP BY-klausulen SQL brukes til å gruppere rader med samme verdier.
- GROUP BY-klausulen brukes sammen med SQL SELECT-setning.
- SELECT-setningen brukt i GROUP BY-leddet kan bare brukes inneholde kolonnenavn, aggregerte funksjoner, konstanter og uttrykk.
- SQL Having-klausul brukes til å begrense resultatene som returneres av GROUP BY-klausulen.
- MYSQL GROUP BY-klausul brukes til å samle inn data fra flere poster og returnerte poster satt av én eller flere kolonner.
