Mye av kraften i relasjonsdatabaser kommer fra filtrering av data og sammenføyning av tabeller. Dette er grunnen til at vi representerer disse relasjonene i utgangspunktet. Men moderne databasesystemer gir en annen verdifull teknikk: gruppering.

Gruppering lar deg trekke ut sammendragsinformasjon fra en database. Den lar deg kombinere resultater for å lage nyttige statistiske data. Gruppering sparer deg for å skrive kode for vanlige tilfeller som å beregne gjennomsnitt av lister over tall. Og det kan gi mer effektive systemer.

Hva gjør GROUP BY-paragrafen?

GROUP BY, som navnet antyder, grupperer resultatene i et mindre sett. Resultatene består av en rad for hver distinkt verdi i den grupperte kolonnen. Vi kan vise bruken ved å se på noen eksempeldata med rader som deler noen vanlige verdier.

Følgende er en veldig enkel database med to tabeller som representerer platealbum. Du kan sette opp en slik database ved å skrive et grunnleggende skjema for det valgte databasesystemet. De album

tabellen har ni rader med en primærnøkkel id kolonne og kolonner for navn, artist, utgivelsesår og salg:

++++++
| id | navn | artist_id | utgivelsesår | salg |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Den mørke siden av månen | 2 | 1973 | 24 |
| 3 | Rykter | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Dyr | 2 | 1977 | 6 |
| 6 | Farvel Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Flaggermus ut av helvete | 7 | 1977 | 28 |
++++++

De kunstnere bordet er enda enklere. Den har syv rader med ID- og navnekolonner:

+++
| id | navn |
+++
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Kjøttbrød |
+++

Du kan forstå forskjellige aspekter av GROUP BY med bare et enkelt datasett som dette. Selvfølgelig ville et reelt datasett ha mange, mange flere rader, men prinsippene forblir de samme.

Gruppering etter en enkelt kolonne

La oss si at vi vil finne ut hvor mange album vi har for hver artist. Start med en typisk Å VELGE spørring for å hente artist_id-kolonnen:

VELG artist_id FRA album

Dette returnerer alle ni radene, som forventet:

++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
++

For å gruppere disse resultatene av artisten, legg til setningen GROUP BY artist_id:

VELG artist_id FRA album GROUP BY artist_id

Som gir følgende resultater:

++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
++

Det er syv rader i resultatsettet, redusert fra totalt ni i album bord. Hver unik artist_id har en enkelt rad. Til slutt, legg til for å få de faktiske tellingene TELLE(*) til de valgte kolonnene:

VELG artist_id, COUNT (*)
FRA album
GROUP BY artist_id
+++
| artist_id | TELLE (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++

Resultatene grupperer to par rader for kunstnerne med ID-er 2 og 6. Hver har to album i databasen vår.

I slekt: The Essential SQL Commands Cheat Sheet for Beginners

Hvordan få tilgang til grupperte data med en samlet funksjon

Du har kanskje brukt TELLE funksjon før, spesielt i TELLE(*) form som sett ovenfor. Den henter antall resultater i et sett. Du kan bruke den til å få totalt antall poster i en tabell:

VELG TELL (*) FRA album
++
| TELLE (*) |
++
| 9 |
++

COUNT er en samlet funksjon. Dette begrepet refererer til funksjoner som oversetter verdier fra flere rader til en enkelt verdi. De brukes ofte sammen med GROUP BY-setningen.

I stedet for bare å telle antall rader, kan vi bruke en samlet funksjon på grupperte verdier:

SELECT artist_id, SUM (salg)
FRA album
GROUP BY artist_id
+++
| artist_id | SUM (salg) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++

Det totale salget som vises ovenfor for artister 2 og 6 er deres salg av flere album:

VELG artist_id, salg
FRA album
WHERE artist_id IN (2, 6)
+++
| artist_id | salg |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++

Gruppering etter flere kolonner

Du kan gruppere etter mer enn en kolonne. Bare inkluder flere kolonner eller uttrykk, atskilt med komma. Resultatene grupperes i henhold til kombinasjonen av disse kolonnene.

VELG release_year, sales, count (*)
FRA album
GROUP BY release_year, salg

Dette vil vanligvis gi flere resultater enn å gruppere etter en enkelt kolonne:

++++
| utgivelsesår | salg | telle (*) |
++++
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
++++

Merk at i vårt lille eksempel har bare to album samme utgivelsesår og salgstall (28 i 1977).

Nyttige samlede funksjoner

Bortsett fra COUNT, fungerer flere funksjoner bra med GROUP. Hver funksjon returnerer en verdi basert på postene som tilhører hver resultatgruppe.

  • COUNT () returnerer det totale antallet samsvarende poster.
  • SUM () returnerer totalen av alle verdiene i den gitte kolonnen lagt sammen.
  • MIN () returnerer den minste verdien i en gitt kolonne.
  • MAX () returnerer den største verdien i en gitt kolonne.
  • AVG () returnerer gjennomsnittlig gjennomsnitt. Det tilsvarer SUM () / COUNT ().

Du kan også bruke disse funksjonene uten en GROUP-setning:

VELG AVG (salg) FRA album
++
| AVG (salg) |
++
| 19.1111 |
++

Bruke GROUP BY med en WHERE-klausul

Akkurat som med et vanlig SELECT, kan du fortsatt bruke WHERE til å filtrere resultatsettet:

VELG artist_id, COUNT (*)
FRA album
HVOR utgivelsesår> 1990
GROUP BY artist_id
+++
| artist_id | TELLE (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++

Nå har du bare albumene utgitt etter 1990, gruppert av artister. Du kan også bruke en sammenkobling med WHERE-setningen, uavhengig av GROUP BY:

VELG r.navn, COUNT (*) AS album
FRA album l, artister r
HVOR artist_id = r.id
OG utgivelsesår> 1990
GROUP BY artist_id
+++
| navn | album |
+++
| Nirvana | 1 |
| Adele | 2 |
+++

Vær imidlertid oppmerksom på at hvis du prøver å filtrere basert på en samlet kolonne:

VELG r.navn, COUNT (*) AS album
FRA album l, artister r
HVOR artist_id = r.id
OG album> 2
GROUP BY artist_id;

Du får en feil:

FEIL 1054 (42S22): Ukjent kolonne 'album' i 'hvor klausul'

Kolonner basert på samlede data er ikke tilgjengelige for WHERE-setningen.

Bruke HAVING-klausulen

Så hvordan filtrerer du resultatsettet etter at en gruppering har funnet sted? De HAR klausul omhandler dette behovet:

VELG r.navn, COUNT (*) AS album
FRA album l, artister r
HVOR artist_id = r.id
GROUP BY artist_id
HAR album> 1;

Merk at HAVING-klausulen kommer etter GROUP BY. Ellers er det egentlig en enkel erstatning av WHERE med HAVING. Resultatene er:

+++
| navn | album |
+++
| Pink Floyd | 2 |
| Adele | 2 |
+++

Du kan fortsatt bruke en WHERE-tilstand for å filtrere resultatene før grupperingen. Det vil fungere sammen med en HAVING-klausul for filtrering etter grupperingen:

VELG r.navn, COUNT (*) AS album
FRA album l, artister r
HVOR artist_id = r.id
OG utgivelsesår> 1990
GROUP BY artist_id
HAR album> 1;

Bare én artist i databasen vår ga ut mer enn ett album etter 1990:

+++
| navn | album |
+++
| Adele | 2 |
+++

Kombinere resultater med GROUP BY

GROUP BY-setningen er en utrolig nyttig del av SQL-språket. Det kan gi sammendragsinformasjon av data, for eksempel til en innholdsside. Det er et utmerket alternativ til å hente store mengder data. Databasen håndterer denne ekstra arbeidsmengden godt siden designen gjør den optimal for jobben.

Når du har forstått gruppering og hvordan du kan delta i flere tabeller, vil du kunne bruke det meste av kraften til en relasjonsdatabase.

E-post
Hvordan spørre flere databasetabeller samtidig med SQL-sammenkoblinger

Lær hvordan du bruker SQL-sammenkoblinger for å strømlinjeforme spørsmål, spare tid og få deg til å føle deg som en SQL-strømbruker.

Relaterte temaer
  • Programmering
  • SQL
Om forfatteren
Bobby Jack (28 artikler publisert)

Bobby er en teknologientusiast som jobbet som programvareutvikler i det meste av to tiår. Han brenner for spill, jobber som Reviews Editor i Switch Player Magazine, og er fordypet i alle aspekter av online publisering og nettutvikling.

Mer fra Bobby Jack

Abonner på vårt nyhetsbrev

Bli med på nyhetsbrevet vårt for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!

Ett steg til…!

Bekreft e-postadressen din i e-posten vi nettopp sendte deg.

.