Aggregaatfuncties lijken op de functies die je al kent (substring, concat, length, round). Het verschil is dat, als je een kolomnaam invult, de aggregaatfunctie op heel de kolom wordt toegepast. Anders gezegd, aggregaatfuncties worden niet binnen een rij toegepast, maar over meerdere rijen heen. Voor elke rij wordt er een waarde geproduceerd en een aggregaatfunctie gebruikt al deze waarden samen als invoer.
Op deze pagina geven we een overzicht van de belangrijkste aggregatiefuncties, maar er bestaan er nog.
calibratie
Voor deze voorbeelden gebruiken we volgende calibratiestap, die je moet opslaan als 0041__CreateHonden.sql:
COUNT krijgt als invoer een lijst rijen en zegt hoeveel niet-NULL elementen er in deze lijst zitten.
De simpelste toepassing is het tellen van al je records, zoals hier in 0042__SelectHonden.sql:
USE ApDB;
SELECT COUNT(Naam)
FROM Honden;
Dit levert slechts één resultaat, ongeacht hoe veel honden er in de database staan. Dit is anders dan bijvoorbeeld LENGTH(Naam). Die laatste zou één resultaat per hond geven. De reden is dat COUNT een aggregaatfunctie is. Ze verzamelt alle waarden in de gegeven kolom Naam, telt hoe veel dat er zijn en toont dat resultaat. Namen die twee keer voorkomen, worden twee keer geteld. Let op: COUNT telt geen NULL-waarden.
Soms wil je gewoon weten hoe veel rijen er in een tabel zijn. Dan gebruik je COUNT(*). Bijvoorbeeld:
USE ApDB;
SELECT COUNT(*)
FROM Honden;
Dit geeft hetzelfde resultaat, want Naam was toch een verplichte kolom.
aggregaatfunctie: SUM
Deze aggregaatfunctie krijgt een expressie en berekent voor de som van het toepassen van deze expressie voor elk record. Een eenvoudig voorbeeld van een expressie is hier (in 0043__SelectHonden.sql) een kolomnaam:
USE ApDB;
SELECT SUM(Leeftijd)
FROM Honden;
Merk op: hier zal je niet zomaar * in plaats van Leeftijd kunnen invullen. Je kan de som nemen van getallen, maar niet van om het even welk soort data. SUM werkt alleen met getallen.
Je kan wel iets algemener een expressie die een getal oplevert invullen, niet gewoon een kolomnaam. Dus je kan ook dit doen:
USE ApDB;
SELECT SUM(Leeftijd+1)
FROM Honden;
Wat levert dit dan? De gezamenlijke leeftijd van alle honden, verhoogd met het aantal honden. Niet het meest praktische voorbeeld, maar je moet kunnen zien waarom dit zo is.
aggregaatfuncties: MIN en MAX
Deze aggregaatfuncties krijgen een expressie en berekenen het minimum of het maximum voor het toepassen van deze expressie voor elk record. Een eenvoudig voorbeeld van een expressie is hier (in 0044__SelectHonden.sql) een kolomnaam:
USE ApDB;
SELECT MAX(Leeftijd)
FROM Honden;
Dit vertelt je wat de leeftijd van de oudste hond in het systeem is.
aggregaatfunctie: AVG
Deze aggregaatfunctie krijgt een expressie en berekent het gemiddelde voor het toepassen van deze expressie voor elk record. Een eenvoudig voorbeeld van een expressie is hier (in 0045__SelectHonden.sql) een kolomnaam:
USE ApDB;
SELECT AVG(Leeftijd)
FROM Honden;
combineren van aggregaatfuncties en niet-geaggregeerde expressies
Onder normale omstandigheden kan je geen combinatie maken van geaggregeerde resultaten en niet-geaggregeerde resultaten. Iets als het volgende gaat dus niet:
USE ApDB;
SELECT COUNT(*), Naam
FROM Honden;
Dit komt omdat je uitvoer nog steeds een tabel is, bestaande uit één aantal rijen en één aantal kolommen. Als je COUNT(*) zou toepassen, zou je één rij overhouden en als je Naam zou opvragen, zou je even veel rijen overhouden als er honden zijn. Dus als deze query zou werken, zou je op basis van de eerste kolom maar één rij mogen hebben en op basis van de tweede kolom zou je er meerdere hebben. Dat gaat niet. Beide kolommen moeten leiden tot hetzelfde aantal rijen.