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.

Oppsummer dette innlegget med: