MySQL Aggregeringsfunktioner: SUMMA, ANTAL, AVG & MAX

⚡ Smart sammanfattning

Aggregera funktioner i MySQL utföra en beräkning över många rader i en enda kolumn och returnera ett summerat värde. De fem ISO-standardfunktionerna — ANTAL, SUMMA, AVG, MIN och MAX — driver nästan alla rapporter som en databas producerar.

  • 🔢 COUNT beteende: COUNT(kolumn) ignorerar NULL-värden, medan COUNT(*) räknar varje rad i tabellen, inklusive dubbletter och NULL-värden.
  • ???? DISTINCT Nyckelord: DISTINCT tar bort dubbletter innan beräkningen körs; ALL är standardinställningen och behåller dem.
  • 📉 MIN och MAX: MIN returnerar det minsta värdet i en kolumn och MAX returnerar det största, både för numeriska tal, strängar och datumtyper.
  • SUMMA och AVG: Båda fungerar endast på numeriska kolumner, och båda exkluderar NULL-rader från det returnerade resultatet.
  • 📊 GRUPPÉRA EFTER Ihopkoppling: Genom att lägga till GROUP BY omvandlas en enskild summeringssiffra till en summeringsrad per grupp.
  • ⚠️ NULL-fälla: AVG dividerar endast med antalet rader som inte är NULL, så saknade värden höjer medelvärdet i det tysta.

Vad är aggregatfunktioner i MySQL?

An aggregerad funktion läser många rader i en enda kolumn och komprimerar dem till ett värde. Aggregeringsfunktioner handlar om:

  • Utföra beräkningar på flera rader
  • Av en enda kolumn i en tabell
  • Och returnera ett enda värde.

ISO-standarden definierar fem (5) aggregerade funktioner, nämligen:

  1. RÄKNA
  2. SUMMA
  3. AVG
  4. MIN
  5. MAX

En regel gäller för alla fem: aggregeringsfunktioner ignorerar NULL-värdenCOUNT(*) är det enda undantaget, och vi tittar på varför nedan.

Varför använda aggregerade funktioner

Olika organisationsnivåer har olika informationskrav. Chefer på högsta nivå är oftast intresserade av hela siffror, inte enskilda detaljer.

Aggregatfunktioner gör att vi enkelt kan producera sammanfattade data från vår databas.

Till exempel kan ledningen kräva följande rapporter från vår myflix-databas:

  • Minst hyrda filmer.
  • Mest hyrda filmer.
  • Genomsnittligt antal gånger som varje film hyrs ut per månad.

Alla ovanstående rapporter kommer från aggregerade funktioner. Låt oss titta på var och en i detalj.

COUNT-funktionen

Funktionen COUNT returnerar det totala antalet värden i det angivna fältet, både numeriska och icke-numeriska datatyper. Liksom alla aggregeringsfunktioner exkluderar COUNT(kolumn) NULL-värden.

COUNT(*) är en specialform som returnerar antalet rader i en tabell. Den räknar också NULLs och dubbletter, eftersom den räknar rader snarare än värden.

Tabellen Movierentals innehåller dessa data:

referensnummer Transaktions Datum Återlämningsdatum medlemsnummer movie_id film_ återvände
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

Låt oss anta att vi vill få antalet gånger som filmen med id 2 har hyrts ut.

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

Att utföra detta i MySQL Arbetsbänk mot myflixdb returnerar 3, eftersom tre rader innehåller movie_id 2.

ANTAL(`film-id`)
3

DISTINKT nyckelord

ANTAL svarar på ”hur många”. Nästa fråga är vanligtvis ”hur många olika "ettor", och det är vad DISTINCT är till för.

DISTINKT nyckelord

Nyckelordet DISTINCT utelämnar dubbletter från våra resultat efter gruppping identiska värden tillsammans, precis som illustrationen ovan antyder.

Låt oss först köra en enkel fråga.

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

Nu samma fråga med nyckelordet DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT utelämnar dubbletter:

movie_id
1
2
3

COUNT vs COUNT(*) vs COUNT(DISTINCT): Vilken ska du använda?

DISTINCT kan också placeras inuti en aggregerad funktion, och det är här de flesta nybörjare förlorar track av vilka rader faktiskt räknas. De fyra formulären nedan körs alla mot samma femradiga filmuthyrningstabell som visades tidigare, men de returnerar inte alla samma tal. Skillnaden beror på två frågor: räknar formuläret rader eller värden, och behåller det dubbletter?

Form Vad det räknas Resultat på hyrfilmer
RÄKNA(*) Varje rad, inklusive dubbletter och rader som är helt NULL 5
ANTAL(`film-id`) Varje värde som inte är NULL i kolumnen, inklusive dubbletter 5
ANTAL(`returdatum`) Endast värden som inte är NULL — de två NULL-returdatumen hoppas över 3
ANTAL(DISTINCT `film_id`) Endast unika värden som inte är NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Tips: Använd COUNT(*) för radantal, COUNT(kolumn) när ett NULL-värde ska betyda "gäller inte", och COUNT(DISTINCT kolumn) för unika värden. Motsatsen till DISTINCT är ALL — standardvärdet och skrivs därför sällan ut.

MIN-funktionen

MIN-funktionen returnerar det minsta värdet i det angivna tabellfältet.

Anta att vi vill ha året då den äldsta filmen i vårt bibliotek släpptes. MySQLs MIN-funktion ger oss det.

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

Resultat:

MIN(`utgivningsår`)
2005

MAX-funktionen

Precis som namnet antyder är MAX-funktionen motsatsen till MIN-funktionen. Det returnerar det största värdet från det angivna tabellfältet.

Anta att vi vill ha året då den senaste filmen i vår databas släpptes. Följande exempel returnerar det.

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

Resultat:

MAX(`utgivningsår`)
2012

SUM-funktionen

MIN och MAX väljer ett befintligt värde från en kolumn. SUM och AVG beräkna ett nytt tal från hela kolumnen.

Anta att vi vill ha det totala beloppet av betalningar som hittills gjorts. MySQL SUMMA fungera returnerar summan av alla värden i den angivna kolumnen. SUM fungerar endast på numeriska fältoch NULL-värden exkluderas från resultatet.

Följande tabell visar informationen i betalningstabellen.

betalnings-id medlemsnummer betalningsdag beskrivning betalt belopp extern_ referensnummer
1 1 23-07-2012 Betalning för filmuthyrning 2500 11
2 1 25-07-2012 Betalning för filmuthyrning 2000 12
3 3 30-07-2012 Betalning för filmuthyrning 6000 NULL

Frågan som visas nedan hämtar alla gjorda betalningar och summerar dem till ett enda resultat: 2500 + 2000 + 6000 = 10500.

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

Resultat:

SUMMA(`betalt_belopp`)
10500

AVG fungera

Ocuco-landskapet MySQL AVG fungera returnerar medelvärdet av värdena i en angiven kolumn. Precis som SUM-funktionen, det fungerar endast på numeriska datatyper.

Anta att vi vill hitta det genomsnittliga beloppet som betalats. Vi kan använda följande fråga, som dividerar summan 10500 med de tre betalningsraderna som inte är NULL.

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

Resultat:

AVG(`betalt_belopp`)
3500

⚠️ Varning: AVG dividerar med antalet rader som inte är NULL, inte med tabellens radantal. Ett NULL-belopp hoppas över istället för att räknas som noll, vilket i tysthet höjer medelvärdet. Använd AVG(IFNULL(`amount_paid`, 0)) när ett saknat värde betyder noll.

Praktiskt exempel: Kombinera aggregeringsfunktioner med GROUP BY

Varje funktion ovan returnerade en siffra för hela tabellen. Att lägga till en GRUPP AV klausulen returnerar en siffra per grupp istället – och det är så riktiga rapporter byggs upp.

Följande exempel grupperar medlemmar efter namn och räknar sedan det totala antalet betalningar, det genomsnittliga betalningsbeloppet och den totala summan av betalningsbeloppen för varje 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ör exemplet ovan i MySQL Workbench ger oss följande resultat.

AVG funktion som används med GROUP BY

Frågan kopplar ihop de två tabellerna i WHERE-klausulen – den äldre kommakopplingsstilen. Modern kod skriver samma logik som en explicit INNERFÖRBINDNING … PÅObservera också att varje icke-aggregerad kolumn i SELECT-listan måste visas i GROUP BY, eller MySQL 5.7 och senare avvisa frågan under ONLY_FULL_GROUP_BY. Se tjänsteman MySQL referens för aggregeringsfunktion.

Vanliga frågor

Ocuco-landskapet VAR klausul filtrerar enskilda rader innan aggregatet beräknas. HAVING filtrerar de grupperade resultaten efteråt, så endast HAVING kan referera till ett aggregat som COUNT(*) eller SUM(betalat_belopp).

Ja. Utan GROUP BY behandlar aggregatet hela resultatmängden som en grupp och returnerar exakt en rad. Genom att lägga till GROUP BY-delningar resulterar det i en rad för varje distinkt gruppvärde.

Ja. Till skillnad från SUM och AVG, MIN och MAX fungerar på alla jämförbara typer. I en textkolumn returnerar de det alfabetiskt ordningsföljda första och sista värdet, och i en datumkolumn det tidigaste och senaste datumet.

Ja. Text-till-SQL-assistenter översätter frågor som "genomsnittlig betalning per medlem" till en GROUP BY-fråga. Kör den genererade SQL-frågan i MySQL Arbetsbänk och kontrollera radantalet innan du litar på siffrorna.

Den vanliga orsaken är NULL-hantering och duplicerade join-rader. En AI-modell kan välja COUNT(*) där COUNT(kolumn) behövs, eller join-rader till en tabell två gånger, vilket blåser upp varje SUMMA. Verifiera alltid mot ett känt tal.

Sammanfatta detta inlägg med: