Mycket av kraften i relationsdatabaser kommer från att filtrera data och sammanfoga tabeller. Det är därför vi representerar dessa relationer i första hand. Men moderna databassystem ger en annan värdefull teknik: gruppering.

Genom gruppering kan du extrahera sammanfattningsinformation från en databas. Det låter dig kombinera resultat för att skapa användbara statistiska data. Gruppering sparar dig från att skriva kod för vanliga fall, såsom medelvärdeslistor med siffror. Och det kan ge effektivare system.

Vad gör GROUP BY-klausulen?

GROUP BY, som namnet antyder, grupperar resultaten i en mindre uppsättning. Resultaten består av en rad för varje distinkt värde i den grupperade kolumnen. Vi kan visa dess användning genom att titta på några exempeldata med rader som delar några vanliga värden.

Följande är en mycket enkel databas med två tabeller som representerar skivalbum. Du kan skapa en sådan databas med skriva ett grundläggande schema för ditt valda databassystem. De album tabellen har nio rader med en primär nyckel

instagram viewer
id kolumn och kolumner för namn, artist, utgivningsår och försäljning:

++++++
| id | namn | artist_id | release_year | försäljning |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Månens mörka sida | 2 | 1973 | 24 |
| 3 | Rykten | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Djur | 2 | 1977 | 6 |
| 6 | Farväl Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
++++++

De konstnärer bordet är ännu enklare. Den har sju rader med id- och namnkolumner:

+++
| id | namn |
+++
| 1 | Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+++

Du kan förstå olika aspekter av GROUP BY med bara en enkel datamängd som denna. Naturligtvis skulle en verklig datamängd ha många, många fler rader, men principerna förblir desamma.

Gruppera efter en enda kolumn

Låt oss säga att vi vill ta reda på hur många album vi har för varje artist. Börja med en typisk VÄLJ fråga för att hämta kolumnen artist_id:

VÄLJ artist_id FRÅN album

Detta returnerar alla nio rader, som förväntat:

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

För att gruppera dessa resultat efter artisten, lägg till frasen GROUP BY artist_id:

VÄLJ artist_id FRÅN album GROUP BY artist_id

Vilket ger följande resultat:

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

Det finns sju rader i resultatuppsättningen, minskat från totalt nio i album tabell. Var och en unik artist_id har en enda rad. Slutligen, för att få de faktiska räkningarna, lägg till RÄKNA(*) till de valda kolumnerna:

VÄLJ artist_id, COUNT (*)
FRÅN album
GROUP BY artist_id
+++
| artist_id | RÄKNING (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++

Resultaten grupperar två par rader för artisterna med id 2 och 6. Var och en har två album i vår databas.

Relaterad: The Essential SQL Commands Cheat Sheet for Beginners

Så här får du tillgång till grupperade data med en sammanlagd funktion

Du kanske har använt RÄKNA fungerar tidigare, särskilt i RÄKNA(*) form enligt ovan. Det hämtar antalet resultat i en uppsättning. Du kan använda den för att få det totala antalet poster i en tabell:

VÄLJ RÄKN (*) FRÅN album
++
| RÄKNING (*) |
++
| 9 |
++

COUNT är en samlad funktion. Denna term avser funktioner som översätter värden från flera rader till ett enda värde. De används ofta tillsammans med GROUP BY-uttalandet.

I stället för att bara räkna antalet rader kan vi tillämpa en sammanlagd funktion på grupperade värden:

VÄLJ artist_id, SUM (försäljning)
FRÅN album
GROUP BY artist_id
+++
| artist_id | SUMMA (försäljning) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++

Den totala försäljningen som visas ovan för artister 2 och 6 är deras försäljning av flera album tillsammans:

VÄLJ artist_id, försäljning
FRÅN album
VAR artist_id IN (2, 6)
+++
| artist_id | försäljning |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++

Gruppera efter flera kolumner

Du kan gruppera efter mer än en kolumn. Inkludera bara flera kolumner eller uttryck, åtskilda av kommatecken. Resultaten grupperas enligt kombinationen av dessa kolumner.

SELECT release_year, sales, count (*)
FRÅN album
GROUP BY release_year, försäljning

Detta ger vanligtvis fler resultat än att gruppera efter en enda kolumn:

++++
| release_year | försäljning | räkna (*) |
++++
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
++++

Observera att i vårt lilla exempel har bara två album samma utgivningsår och försäljningsantal (28 1977).

Användbara aggregerade funktioner

Bortsett från COUNT fungerar flera funktioner bra med GROUP. Varje funktion returnerar ett värde baserat på de poster som tillhör varje resultatgrupp.

  • COUNT () returnerar det totala antalet matchande poster.
  • SUM () returnerar summan av alla värden i den angivna kolumnen.
  • MIN () returnerar det minsta värdet i en given kolumn.
  • MAX () returnerar det största värdet i en viss kolumn.
  • AVG () returnerar medelvärdet. Det motsvarar SUM () / COUNT ().

Du kan också använda dessa funktioner utan en GROUP-sats:

VÄLJ AVG (försäljning) FRÅN album
++
| AVG (försäljning) |
++
| 19.1111 |
++

Använda GROUP BY med en WHERE-klausul

Precis som med en normal SELECT kan du fortfarande använda WHERE för att filtrera resultatuppsättningen:

VÄLJ artist_id, COUNT (*)
FRÅN album
VAR release_year> 1990
GROUP BY artist_id
+++
| artist_id | RÄKNING (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++

Nu har du bara de album som släppts efter 1990, grupperade efter artist. Du kan också använda en koppling med WHERE-klausulen, oberoende av GROUP BY:

VÄLJ r.namn, COUNT (*) AS-album
FRÅN album l, artister r
VAR artist_id = r.id
OCH släpp_år> 1990
GROUP BY artist_id
+++
| namn | album |
+++
| Nirvana | 1 |
| Adele | 2 |
+++

Observera dock att om du försöker filtrera baserat på en aggregerad kolumn:

VÄLJ r.namn, COUNT (*) AS-album
FRÅN album l, artister r
VAR artist_id = r.id
OCH album> 2
GROUP BY artist_id;

Du får ett fel:

FEL 1054 (42S22): Okänd kolumn "album" i "där klausul"

Kolumner baserade på aggregerade data är inte tillgängliga för WHERE-klausulen.

Använda HAVING-klausulen

Så, hur filtrerar du resultatuppsättningen efter att en gruppering har ägt rum? De HAR klausul handlar om detta behov:

VÄLJ r.namn, COUNT (*) AS-album
FRÅN album l, artister r
VAR artist_id = r.id
GROUP BY artist_id
HAR album> 1;

Observera att HAVING-klausulen kommer efter GROUP BY. Annars är det i grunden en enkel ersättning av WHERE med HAVING. Resultaten är:

+++
| namn | album |
+++
| Pink Floyd | 2 |
| Adele | 2 |
+++

Du kan fortfarande använda ett WHERE-villkor för att filtrera resultaten före grupperingen. Det kommer att fungera tillsammans med en HAVING-sats för filtrering efter grupperingen:

VÄLJ r.namn, COUNT (*) AS-album
FRÅN album l, artister r
VAR artist_id = r.id
OCH släpp_år> 1990
GROUP BY artist_id
HAR album> 1;

Endast en artist i vår databas släppte mer än ett album efter 1990:

+++
| namn | album |
+++
| Adele | 2 |
+++

Kombinera resultat med GROUP BY

GROUP BY-uttalandet är en oerhört användbar del av SQL-språket. Det kan ge sammanfattande information om data, till exempel för en innehållssida. Det är ett utmärkt alternativ till att hämta stora mängder data. Databasen hanterar denna extra arbetsbelastning väl eftersom dess design gör den optimal för jobbet.

När du förstår gruppering och hur du går med i flera tabeller kan du använda det mesta av kraften i en relationsdatabas.

E-post
Hur man frågar efter flera databastabeller samtidigt med SQL-anslutningar

Lär dig hur du använder SQL-kopplingar för att effektivisera frågor, spara tid och få dig att känna dig som en SQL-kraftanvändare.

Relaterade ämnen
  • Programmering
  • SQL
Om författaren
Bobby Jack (28 artiklar publicerade)

Bobby är en teknikentusiast som arbetat som programutvecklare under mer än två decennier. Han brinner för spel, arbetar som Recensentredaktör på Switch Player Magazine och är nedsänkt i alla aspekter av onlinepublicering och webbutveckling.

Mer från Bobby Jack

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!

Ett steg till…!

Bekräfta din e-postadress i e-postmeddelandet som vi just skickade till dig.

.