MySQL Aggregerte funksjoner: SUM, COUNT, AVG & MAX

⚡ Smart oppsummering

Samle funksjoner i MySQL utføre en beregning på tvers av mange rader i en enkelt kolonne og returnere én summert verdi. De fem ISO-standardfunksjonene – ANTALL, SUMMER, AVG, MIN og MAX – driver nesten alle rapporter en database produserer.

  • 🔢 COUNT-oppførsel: COUNT(kolonne) ignorerer NULL-verdier, mens COUNT(*) teller hver rad i tabellen, inkludert duplikater og NULL-er.
  • 🚫 DISTINCT-nøkkelord: DISTINCT fjerner dupliserte verdier før beregningen kjøres; ALL er standardverdien og beholder dem.
  • 📉 MIN og MAKS: MIN returnerer den minste verdien i en kolonne, og MAX returnerer den største, både for numeriske tall, strenger og datotyper.
  • SUM og AVG: Begge opererer bare på numeriske kolonner, og begge ekskluderer NULL-rader fra det returnerte resultatet.
  • 📊 GROUP BY Paring: Hvis du legger til GROUP BY, blir én enkelt sammendragsfigur gjort om til én sammendragsrad per gruppe.
  • ⚠️ NULL-felle: AVG deler kun på antallet rader som ikke er NULL, slik at manglende verdier øker gjennomsnittet i stillhet.

Hva er aggregatfunksjoner i MySQL?

An aggregert funksjon leser mange rader i en enkelt kolonne og samler dem til én verdi. Aggregerte funksjoner handler om:

  • Utføre beregninger på flere rader
  • Av en enkelt kolonne i en tabell
  • Og returnerer én enkelt verdi.

ISO-standarden definerer fem (5) aggregerte funksjoner, nemlig:

  1. COUNT
  2. SUM
  3. AVG
  4. MIN
  5. MAX

Én regel gjelder for alle fem: aggregatfunksjoner ignorerer NULL-verdierCOUNT(*) er det eneste unntaket, og vi ser på hvorfor nedenfor.

Hvorfor bruke aggregerte funksjoner

Ulike organisasjonsnivåer har ulike informasjonskrav. Toppledere er vanligvis interessert i hele tall, ikke individuelle detaljer.

Aggregerte funksjoner lar oss enkelt produsere oppsummerte data fra databasen vår.

For eksempel kan ledelsen kreve følgende rapporter fra myflix-databasen vår:

  • Minst leide filmer.
  • De fleste leide filmer.
  • Gjennomsnittlig antall ganger hver film leies ut i løpet av en måned.

Alle rapportene ovenfor kommer fra aggregerte funksjoner. La oss se nærmere på hver av dem.

COUNT funksjon

COUNT-funksjonen returnerer det totale antallet verdier i det angitte feltet, både på numeriske og ikke-numeriske datatyper. Som alle aggregerte funksjoner ekskluderer COUNT(kolonne) NULL-verdier.

COUNT(*) er en spesialform som returnerer antallet rader i en tabell. Den teller også NULL og duplikater, fordi den teller rader i stedet for verdier.

Tabellen for filmutleie inneholder disse dataene:

referansenummer transaksjonsdato return_date medlemsnummer movie_id film_ returnerte
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

La oss anta at vi ønsker å få antall ganger filmen med ID 2 har blitt leid ut.

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Utfører dette i MySQL Workbench mot myflixdb returnerer 3, fordi tre rader har movie_id 2.

ANTALL(`film_id`)
3

DISTINKT nøkkelord

ANTALL svarer på «hvor mange». Det neste spørsmålet er vanligvis «hvor mange». forskjellig «og det er det DISTINCT er til for.

DISTINKT nøkkelord

Nøkkelordet DISTINCT utelater duplikater fra resultatene våre etter gruppeping identiske verdier sammen, akkurat som illustrasjonen ovenfor antyder.

La oss først utføre en enkel spørring.

SELECT `movie_id` FROM `movierentals`;
movie_id
1
2
2
2
3

Nå samme spørring med DISTINCT-nøkkelordet:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT utelater duplikatpostene:

movie_id
1
2
3

COUNT vs. COUNT(*) vs. COUNT(DISTINCT): Hvilken bør du bruke?

DISTINCT kan også plasseres innsiden en aggregert funksjon, og det er her de fleste nybegynnere taper track av hvilke rader faktisk telles. De fire skjemaene nedenfor kjører alle mot den samme femrads-tabellen for filmutleie som ble vist tidligere, men de returnerer ikke alle det samme tallet. Forskjellen kommer ned til to spørsmål: teller skjemaet rader eller verdier, og beholder det duplikater?

Form Hva det teller Resultat på filmutleie
TELLE(*) Hver rad, inkludert duplikater og rader som er fullstendig NULL 5
ANTALL(`film_id`) Alle ikke-NULL-verdier i kolonnen, inkludert duplikater 5
ANTALL(`returdato`) Kun verdier som ikke er NULL – de to NULL-returdatoene hoppes over 3
ANTALL(DISTINCT `film_id`) Kun unike ikke-NULL-verdier 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Tips: Bruk COUNT(*) for et radantall, COUNT(kolonne) når en NULL skal bety «gjelder ikke», og COUNT(DISTINCT kolonne) for unike verdier. Det motsatte av DISTINCT er ALL – standardverdien, og derfor sjelden skrevet ut.

MIN funksjon

MIN-funksjonen returnerer den minste verdien i det angitte tabellfeltet.

Anta at vi vil ha året den eldste filmen i biblioteket vårt ble utgitt. MySQLMIN-funksjonen gir oss det.

SELECT MIN(`year_released`) FROM `movies`;

Resultat:

MIN(`utgivelsesår`)
2005

MAX-funksjon

Akkurat som navnet antyder, er MAX-funksjonen det motsatte av MIN-funksjonen. Den returnerer den største verdien fra det angitte tabellfeltet.

Anta at vi ønsker året den nyeste filmen i databasen vår ble utgitt. Følgende eksempel returnerer det.

SELECT MAX(`year_released`) FROM `movies`;

Resultat:

MAX(`utgivelsesår`)
2012

SUM funksjon

MIN og MAX velger en eksisterende verdi fra en kolonne. SUM og AVG Beregn et nytt tall fra hele kolonnen.

Anta at vi ønsker det totale beløpet av betalinger som er gjort så langt. MySQL SUM funksjon returnerer summen av alle verdiene i den angitte kolonnen. SUM fungerer kun på numeriske feltog NULL-verdier er ekskludert fra resultatet.

Tabellen nedenfor viser dataene i betalingstabellen.

betalings-ID medlemsnummer betalingsdato beskrivelse beløp_ betalt ekstern_referansenummer
1 1 23-07-2012 Betaling for leie av film 2500 11
2 1 25-07-2012 Betaling for leie av film 2000 12
3 3 30-07-2012 Betaling for leie av film 6000 NULL

Spørringen som vises nedenfor henter alle betalingene som er gjort og summerer dem opp til ett enkelt resultat: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Resultat:

SUM(`betalt_beløp`)
10500

AVG funksjon

Ocuco MySQL AVG funksjon returnerer gjennomsnittet av verdiene i en spesifisert kolonne. Akkurat som SUM-funksjonen, det fungerer bare på numeriske datatyper.

Anta at vi ønsker å finne det gjennomsnittlige betalte beløpet. Vi kan bruke følgende spørring, som deler summen på 10500 med de tre betalingsradene som ikke er NULL.

SELECT AVG(`amount_paid`) FROM `payments`;

Resultat:

AVG(`betalt_beløp`)
3500

⚠️ Advarsel: AVG deler på antall rader som ikke er NULL, ikke på radantallet i tabellen. Et NULL-beløp hoppes over i stedet for å telles som null, noe som stille presser gjennomsnittet opp. Bruk AVG(IFNULL(`betalt_beløp`, 0)) når en manglende verdi betyr null.

Praktisk eksempel: Kombinering av aggregeringsfunksjoner med GROUP BY

Hver funksjon ovenfor returnerte ett tall for hele tabellen. Legge til en GRUPPE AV leddsetningen returnerer ett siffer per gruppe i stedet – og det er slik ekte rapporter bygges.

Følgende eksempel grupperer medlemmer etter navn, og teller deretter det totale antallet betalinger, det gjennomsnittlige betalingsbeløpet og den totale summen av betalingsbeløpene for hvert medlem.

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

Utføre eksemplet ovenfor i MySQL Workbench gir oss følgende resultater.

AVG funksjon brukt med GROUP BY

Spørringen kobler de to tabellene sammen i WHERE-klausulen – den eldre kommakoblingsstilen. Moderne kode skriver den samme logikken som en eksplisitt INDRE SAMMENSLUTNING … PÅMerk også at alle ikke-aggregerte kolonner i SELECT-listen må vises i GROUP BY, eller MySQL 5.7 og senere avvis spørringen under ONLY_FULL_GROUP_BY. Se offisiell MySQL referanse for samlet funksjon.

Spørsmål og svar

Ocuco HVOR klausul filtrerer individuelle rader før aggregatet beregnes. HAVING filtrerer de grupperte resultatene etterpå, slik at bare HAVING kan referere til et aggregat som COUNT(*) eller SUM(beløp_betalt).

Ja. Uten GROUP BY behandler aggregatet hele resultatsettet som én gruppe og returnerer nøyaktig én rad. Ved å legge til GROUP BY-delinger som resulterer i én rad for hver distinkte gruppeverdi.

Ja. I motsetning til SUM og AVG, MIN og MAX fungerer på alle sammenlignbare typer. I en tekstkolonne returnerer de den alfabetisk ordnede første og siste verdien, og i en datokolonne den tidligste og siste datoen.

Ja. Tekst-til-SQL-assistenter oversetter spørsmål som «gjennomsnittlig betaling per medlem» til en GROUP BY-spørring. Kjør den genererte SQL-en i MySQL Workbench og sjekk radantallene før du stoler på tallene.

Den vanlige årsaken er NULL-håndtering og dupliserte sammenføyningsrader. En AI-modell kan velge COUNT(*) der COUNT(kolonne) er nødvendig, eller sammenføye en tabell to ganger, noe som blåser opp hver SUM. Verifiser alltid mot et kjent tall.

Oppsummer dette innlegget med: