MySQL Aggregatiefuncties: SOM, AANTAL, AVG & MAX

⚡ Slimme samenvatting

Geaggregeerde functies in MySQL Voer een berekening uit over meerdere rijen van één kolom en retourneer één samengevatte waarde. De vijf ISO-standaardfuncties — COUNT, SUM, AVG, MIN en MAX vormen de basis van vrijwel elk rapport dat een database produceert.

  • 🔢 COUNT-gedrag: COUNT(column) negeert NULL-waarden, terwijl COUNT(*) elke rij in de tabel telt, inclusief duplicaten en NULL-waarden.
  • ???? Onderscheidend trefwoord: DISTINCT verwijdert dubbele waarden voordat de berekening wordt uitgevoerd; ALL is de standaardinstelling en behoudt ze.
  • 📉 MIN en MAX: MIN retourneert de kleinste waarde in een kolom en MAX de grootste, zowel voor numerieke, tekenreeks- als datumtypen.
  • SOM en AVG: Beide methoden werken alleen met numerieke kolommen en sluiten rijen met NULL-waarden uit van het geretourneerde resultaat.
  • 📊 GROEPEREN OP Koppeling: Door GROUP BY toe te voegen, wordt één samenvattend cijfer omgezet in één samenvattende rij per groep.
  • ⚠️ NULL-val: AVG Er wordt alleen gedeeld door het aantal rijen dat geen NULL-waarde bevat, waardoor ontbrekende waarden het gemiddelde ongemerkt verhogen.

Wat zijn aggregatiefuncties in MySQL?

An geaggregeerde functie Een aggregatiefunctie leest meerdere rijen van één kolom en voegt deze samen tot één waarde. Bij aggregatiefuncties draait het allemaal om:

  • Berekeningen uitvoeren op meerdere rijen
  • Van een enkele kolom van een tabel
  • En het retourneren van een enkele waarde.

De ISO-norm definieert vijf (5) aggregatiefuncties, namelijk:

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

Eén regel geldt voor alle vijf: Aggregatiefuncties negeren NULL-waarden.COUNT(*) is de enige uitzondering, en we zullen hieronder bekijken waarom.

Waarom aggregatiefuncties gebruiken

Verschillende organisatieniveaus hebben verschillende informatiebehoeften. Managers op het hoogste niveau zijn doorgaans geïnteresseerd in totale cijfers, niet in individuele details.

Met geaggregeerde functies kunnen we eenvoudig samengevatte gegevens uit onze database produceren.

Het management kan bijvoorbeeld de volgende rapporten uit onze MyFlix-database nodig hebben:

  • Minst gehuurde films.
  • Meest gehuurde films.
  • Het gemiddelde aantal keren dat elke film per maand wordt uitgeleend.

Alle bovenstaande rapporten zijn afkomstig van aggregatiefuncties. Laten we ze eens nader bekijken.

AANTAL functie

De COUNT-functie retourneert het totale aantal waarden in het opgegeven veld, zowel voor numerieke als niet-numerieke gegevenstypen. Net als elke andere aggregatiefunctie sluit COUNT(column) NULL-waarden uit.

COUNT(*) is een speciale vorm die het aantal rijen in een tabel retourneert. Het telt ook NULL's en duplicaten, omdat het rijen telt in plaats van waarden.

De tabel movierentals bevat deze gegevens:

referentienummer transactie datum retourdatum lidmaatschapsnummer film_id film_ terug
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

Stel dat we willen weten hoe vaak de film met ID 2 is uitgeleend.

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

Dit uitvoeren in MySQL Werkbank De query tegen myflixdb geeft 3 als resultaat, omdat drie rijen movie_id 2 bevatten.

COUNT(`movie_id`)
3

VERSCHILLEND trefwoord

COUNT beantwoordt de vraag "hoeveel?". De volgende vraag is meestal "hoeveel?". anders "Enkele", en daarvoor is DISTINCT er.

VERSCHILLEND trefwoord

Het trefwoord DISTINCT filtert duplicaten uit onze resultaten per groep.ping identieke waarden bij elkaar, precies zoals de bovenstaande illustratie suggereert.

Laten we eerst een eenvoudige query uitvoeren.

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

Nu dezelfde zoekopdracht met het trefwoord DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT verwijdert de dubbele records:

film_id
1
2
3

COUNT vs COUNT(*) vs COUNT(DISTINCT): Welke moet je gebruiken?

DISTINCT kan ook geplaatst worden binnen een aggregatiefunctie, en dit is waar de meeste beginners de mist in gaan. tracwaarvan de rijen daadwerkelijk worden geteld. De vier onderstaande formulieren worden allemaal uitgevoerd op dezelfde tabel met vijf rijen (filmverhuur) die eerder werd getoond, maar ze geven niet allemaal hetzelfde resultaat. Het verschil komt neer op twee vragen: telt het formulier rijen of waarden, en worden duplicaten behouden?

Form Wat het waard is Resultaat op het gebied van filmverhuur
GRAAF(*) Elke rij, inclusief duplicaten en rijen die volledig NULL zijn. 5
COUNT(`movie_id`) Alle niet-NULL-waarden in de kolom, inclusief duplicaten. 5
COUNT(`return_date`) Alleen niet-NULL-waarden worden geaccepteerd; de twee NULL-retourdatums worden overgeslagen. 3
COUNT(DISTINCT `movie_id`) Alleen unieke niet-NULL-waarden 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡Tip: Gebruik COUNT(*) voor het tellen van rijen, COUNT(kolom) wanneer NULL betekent "niet van toepassing", en COUNT(DISTINCT-kolom) voor unieke waarden. Het tegenovergestelde van DISTINCT is ALL — de standaardwaarde, en daarom wordt deze zelden uitgeschreven.

MIN-functie

De MIN-functie retourneert de kleinste waarde in het opgegeven tabelveld.

Stel dat we het jaar willen weten waarin de oudste film in onze collectie is uitgebracht. MySQLDe MIN-functie van 's geeft ons dat.

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

Resultaat:

MIN(`jaar_uitgebracht`)
2005

MAX-functie

Zoals de naam al doet vermoeden, is de MAX-functie het tegenovergestelde van de MIN-functie. Het retourneert de grootste waarde uit het opgegeven tabelveld.

Stel dat we het jaar willen weten waarin de meest recente film in onze database is uitgebracht. Het volgende voorbeeld geeft dat weer.

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

Resultaat:

MAX(`jaar_uitgebracht`)
2012

SOM-functie

MIN en MAX selecteren een bestaande waarde uit een kolom. SUM en AVG Bereken een nieuw getal op basis van de hele kolom.

Stel dat we het totale bedrag van de tot nu toe gedane betalingen willen weten. MySQL SOM functie retourneert de som van alle waarden in de opgegeven kolom.. SOM werkt alleen op numerieke veldenen NULL-waarden worden uitgesloten van het resultaat..

De volgende tabel toont de gegevens in de betalingstabel.

betalings_id lidmaatschapsnummer betaaldatum beschrijving betaald bedrag extern_referentie_nummer
1 1 23-07-2012 Betaling van filmhuur 2500 11
2 1 25-07-2012 Betaling van filmhuur 2000 12
3 3 30-07-2012 Betaling van filmhuur 6000 NULL

De onderstaande query haalt alle gedane betalingen op en telt ze op tot één resultaat: 2500 + 2000 + 6000 = 10500.

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

Resultaat:

SOM(`betaald bedrag`)
10500

AVG functie

De MySQL AVG functie retourneert het gemiddelde van de waarden in een opgegeven kolom. Net als de SUM-functie is het werkt alleen op numerieke gegevenstypen.

Stel dat we het gemiddelde betaalde bedrag willen berekenen. We kunnen hiervoor de volgende query gebruiken, die het totaal van 10500 deelt door de drie niet-lege betalingsrijen.

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

Resultaat:

AVG(`betaald bedrag`)
3500

⚠️ Waarschuwing: AVG Deelt door het aantal niet-NULL-rijen, niet door het aantal rijen in de tabel. Een NULL-waarde wordt overgeslagen in plaats van als nul geteld, waardoor het gemiddelde ongemerkt hoger uitvalt. Gebruik AVG(IFNULL(`amount_paid`, 0)) wanneer een ontbrekende waarde nul betekent.

Praktisch voorbeeld: Aggregatiefuncties combineren met GROUP BY

Elke bovenstaande functie gaf één cijfer terug voor de hele tabel. Het toevoegen van een GROEP DOOR clausule retourneert één cijfer per groep In plaats daarvan – en zo worden echte rapporten opgesteld.

Het volgende voorbeeld groepeert leden op naam en telt vervolgens het totale aantal betalingen, het gemiddelde betalingsbedrag en het totaalbedrag van de betalingen voor elk lid.

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`;

Voer het bovenstaande voorbeeld uit in MySQL Workbench levert de volgende resultaten op.

AVG functie gebruikt met GROUP BY

De query voegt de twee tabellen samen in de WHERE-clausule — de oudere methode met een komma-join. Moderne code gebruikt dezelfde logica als een expliciete join. BINNENVERBINDING … AANMerk ook op dat elke niet-geaggregeerde kolom in de SELECT-lijst in GROUP BY moet voorkomen, of MySQL Versie 5.7 en later wijst de query af onder ONLY_FULL_GROUP_BY. Zie de officieel MySQL referentiefunctie voor aggregatie.

Veelgestelde vragen

De WHERE-clausule HAVING filtert individuele rijen voordat de aggregatie wordt berekend. HAVING filtert de gegroepeerde resultaten erna, dus alleen HAVING kan verwijzen naar een aggregatie zoals COUNT(*) of SUM(amount_paid).

Ja. Zonder GROUP BY behandelt de aggregatiefunctie de gehele resultaatset als één groep en retourneert precies één rij. Door GROUP BY toe te voegen, wordt dat resultaat opgesplitst in één rij voor elke afzonderlijke groepswaarde.

Ja. In tegenstelling tot SUM en AVGMIN en MAX werken op elk vergelijkbaar gegevenstype. In een tekstkolom retourneren ze de alfabetisch eerste en laatste waarde, en in een datumkolom de vroegste en laatste datum.

Ja. Tekst-naar-SQL-assistenten vertalen vragen zoals 'gemiddelde betaling per lid' naar een GROUP BY-query. Voer de gegenereerde SQL uit in MySQL Werkbank en controleer het aantal rijen voordat je de cijfers vertrouwt.

De gebruikelijke oorzaak is de verwerking van NULL-waarden en dubbele rijen in joins. Een AI-model kan COUNT(*) gebruiken waar COUNT(kolom) nodig is, of een tabel twee keer koppelen, waardoor elke SUM-waarde wordt opgeblazen. Controleer altijd met een bekende waarde.

Vat dit bericht samen met: