Meget af styrken i relationsdatabaser kommer fra filtrering af data og sammenføjning af tabeller. Det er derfor, vi repræsenterer disse forhold i første omgang. Men moderne databasesystemer giver en anden værdifuld teknik: gruppering.

Gruppering giver dig mulighed for at udtrække resuméoplysninger fra en database. Det giver dig mulighed for at kombinere resultater for at skabe nyttige statistiske data. Gruppering sparer dig for at skrive kode til almindelige sager, såsom gennemsnit af lister over tal. Og det kan skabe mere effektive systemer.

Hvad gør GROUP BY-klausulen?

GROUP BY, som navnet antyder, grupperer resultaterne i et mindre sæt. Resultaterne består af en række for hver særskilt værdi i den grupperede kolonne. Vi kan vise dets anvendelse ved at se på nogle eksempeldata med rækker, der deler nogle fælles værdier.

Følgende er en meget enkel database med to tabeller, der repræsenterer rekordalbum. Du kan oprette en sådan database ved at skrive et grundlæggende skema til dit valgte databasesystem. Det

instagram viewer
album tabellen har ni rækker med en primær nøgle id kolonne og kolonner for navn, kunstner, udgivelsesår og salg:

++++++
| id | navn | artist_id | frigivelsesår | salg |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Den mørke side af månen | 2 | 1973 | 24 |
| 3 | Rygter | 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 | Flagermus ud af helvede | 7 | 1977 | 28 |
++++++

Det kunstnere tabellen er endnu enklere. Det har syv rækker med id- og navnekolonner:

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

Du kan forstå forskellige aspekter af GROUP BY med blot et simpelt datasæt som dette. Selvfølgelig ville et datasæt fra det virkelige liv have mange, mange flere rækker, men principperne forbliver de samme.

Gruppering efter en enkelt kolonne

Lad os sige, at vi vil finde ud af, hvor mange albums vi har for hver kunstner. Start med en typisk VÆLG forespørgsel for at hente kolonnen artist_id:

VÆLG artist_id FRA album

Dette returnerer alle ni rækker som forventet:

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

For at gruppere disse resultater efter kunstneren skal du tilføje sætningen GROUP BY artist_id:

VÆLG artist_id FRA album GROUP BY artist_id

Hvilket giver følgende resultater:

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

Der er syv rækker i resultatsættet, reduceret fra de samlede ni i album bord. Hver unik kunstner_id har en enkelt række. Endelig skal du tilføje for at få det faktiske antal TÆLLE(*) til de valgte kolonner:

VÆLG artist_id, COUNT (*)
FRA album
GROUP BY artist_id
+++
| artist_id | TÆLLING (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++

Resultaterne grupperer to par rækker for kunstnerne med id'er 2 og 6. Hver har to album i vores database.

Relaterede: The Essential SQL Commands Cheat Sheet for Beginners

Sådan får du adgang til grupperede data med en samlet funktion

Du har muligvis brugt TÆLLE funktion før, især i TÆLLE(*) form som set ovenfor. Det henter antallet af resultater i et sæt. Du kan bruge det til at få det samlede antal poster i en tabel:

VÆLG TÆLL (*) FRA album
++
| TÆLLING (*) |
++
| 9 |
++

COUNT er en samlet funktion. Dette udtryk henviser til funktioner, der oversætter værdier fra flere rækker til en enkelt værdi. De bruges ofte i forbindelse med GROUP BY-sætningen.

I stedet for bare at tælle antallet af rækker kan vi anvende en samlet funktion til grupperede værdier:

VÆLG 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 samlede salg vist ovenfor for kunstnere 2 og 6 er deres salg af flere albums kombineret:

VÆLG artist_id, salg
FRA album
HVOR artist_id IN (2, 6)
+++
| artist_id | salg |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++

Gruppering efter flere kolonner

Du kan gruppere efter mere end en kolonne. Inkluder bare flere kolonner eller udtryk, adskilt med kommaer. Resultaterne grupperes efter kombinationen af ​​disse kolonner.

VÆLG frigivelsesår, salg, antal (*)
FRA album
GROUP BY release_year, salg

Dette giver typisk flere resultater end gruppering efter en enkelt kolonne:

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

Bemærk, at kun to albums i vores lille eksempel har samme udgivelsesår og salgstal (28 i 1977).

Nyttige samlede funktioner

Bortset fra COUNT fungerer flere funktioner godt med GROUP. Hver funktion returnerer en værdi baseret på de poster, der tilhører hver resultatgruppe.

  • COUNT () returnerer det samlede antal matchende poster.
  • SUM () returnerer det samlede antal af alle værdier i den givne kolonne tilføjet.
  • MIN () returnerer den mindste værdi i en given kolonne.
  • MAX () returnerer den største værdi i en given kolonne.
  • AVG () returnerer det gennemsnitlige gennemsnit. Det svarer til SUM () / COUNT ().

Du kan også bruge disse funktioner uden en GROUP-klausul:

VÆLG AVG (salg) FRA album
++
| AVG (salg) |
++
| 19.1111 |
++

Brug af GROUP BY med en WHERE-klausul

Ligesom med et normalt SELECT kan du stadig bruge WHERE til at filtrere resultatsættet:

VÆLG artist_id, COUNT (*)
FRA album
HVOR release_year> 1990
GROUP BY artist_id
+++
| artist_id | TÆLLING (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++

Nu har du kun de albums udgivet efter 1990, grupperet efter kunstner. Du kan også bruge en sammenkædning med WHERE-klausulen uafhængigt af GROUP BY:

VÆLG r.navn, COUNT (*) AS album
FRA album l, kunstnere r
HVOR artist_id = r.id
OG frigivelsesår> 1990
GROUP BY artist_id
+++
| navn | album |
+++
| Nirvana | 1 |
| Adele | 2 |
+++

Bemærk dog, at hvis du forsøger at filtrere baseret på en samlet kolonne:

VÆLG r.navn, COUNT (*) AS album
FRA album l, kunstnere r
HVOR artist_id = r.id
OG album> 2
GRUPPE AF artist_id;

Du får en fejl:

FEJL 1054 (42S22): Ukendt kolonne 'album' i 'hvor klausul'

Kolonner baseret på samlede data er ikke tilgængelige for WHERE-klausulen.

Brug af HAVING-klausulen

Så hvordan filtrerer du resultatsættet, efter at en gruppering har fundet sted? Det AT HAVE klausul omhandler dette behov:

VÆLG r.navn, COUNT (*) AS album
FRA album l, kunstnere r
HVOR artist_id = r.id
GROUP BY artist_id
HAR album> 1;

Bemærk, at HAVING-klausulen kommer efter GROUP BY. Ellers er det i det væsentlige en simpel erstatning af WHERE med HAVING. Resultaterne er:

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

Du kan stadig bruge en WHERE-tilstand til at filtrere resultaterne før grupperingen. Det fungerer sammen med en HAVING-klausul til filtrering efter grupperingen:

VÆLG r.navn, COUNT (*) AS album
FRA album l, kunstnere r
HVOR artist_id = r.id
OG frigivelsesår> 1990
GROUP BY artist_id
HAR album> 1;

Kun en kunstner i vores database udgav mere end et album efter 1990:

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

Kombination af resultater med GROUP BY

GROUP BY-sætningen er en utrolig nyttig del af SQL-sproget. Det kan f.eks. Give oplysninger om data for en indholdsside. Det er et glimrende alternativ til at hente store mængder data. Databasen håndterer denne ekstra arbejdsbyrde godt, da selve designet gør den optimal til jobbet.

Når du først har forstået gruppering, og hvordan du deltager i flere tabeller, kan du udnytte det meste af styrken i en relationsdatabase.

E-mail
Sådan spørges flere databasetabeller på én gang med SQL-sammenføjninger

Lær, hvordan du bruger SQL-sammenføjninger til at strømline forespørgsler, spare tid og få dig til at føle dig som en SQL-strømbruger.

Relaterede emner
  • Programmering
  • SQL
Om forfatteren
Bobby Jack (28 artikler offentliggjort)

Bobby er en teknologientusiast, der arbejdede som softwareudvikler i det meste af to årtier. Han brænder for spil, arbejder som Reviews Editor i Switch Player Magazine og er fordybet i alle aspekter af onlineudgivelse og webudvikling.

Mere fra Bobby Jack

Abonner på vores nyhedsbrev

Deltag i vores nyhedsbrev for tekniske tip, anmeldelser, gratis e-bøger og eksklusive tilbud!

Et trin mere !!!

Bekræft din e-mail-adresse i den e-mail, vi lige har sendt dig.

.