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.
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:
- COUNT
- SOM
- AVG
- MIN
- 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.
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.
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.



