SQL-trackLes 6 van 10

📈 Aggregaties

Statistieken berekenen met COUNT, SUM, AVG — en groeperen met GROUP BY en HAVING.

⏱ 25 min6 stappenInteractieve SQL-sandbox
Stap 1 / 6

Aggregatiefuncties

Aggregatiefuncties berekenen een waarde over meerdere rijen en geven één resultaat terug.

COUNT()

Telt rijen

SELECT COUNT(*) FROM gebruikers;
SUM()

Telt waarden op

SELECT SUM(prijs) FROM producten;
AVG()

Berekent het gemiddelde

SELECT AVG(leeftijd) FROM gebruikers;
MIN()

Laagste waarde

SELECT MIN(prijs) FROM producten;
MAX()

Hoogste waarde

SELECT MAX(prijs) FROM producten;
COUNT(DISTINCT)

Unieke waarden tellen

SELECT COUNT(DISTINCT categorie) FROM producten;
COUNT(*) vs COUNT(kolom)

COUNT(*) telt alle rijen inclusief NULL. COUNT(kolom) telt alleen rijen waarbij die kolom niet NULL is.

Stap 2 / 6

GROUP BY — per groep aggregeren

GROUP BY verdeelt rijen in groepen en past een aggregatiefunctie toe op elke groep.

Zonder GROUP BY
SELECT COUNT(*) FROM producten;
-- Geeft: 6 (alle producten samen)
Met GROUP BY
SELECT categorie, COUNT(*)
FROM producten
GROUP BY categorie;
-- Elektronica: 3, Meubels: 2, Wonen: 1
GROUP BY met meerdere aggregaties
SELECT
    categorie,
    COUNT(*)        AS aantal_producten,
    AVG(prijs)      AS gemiddelde_prijs,
    MIN(prijs)      AS goedkoopste,
    MAX(prijs)      AS duurste
FROM producten
GROUP BY categorie
ORDER BY gemiddelde_prijs DESC;
⚠️ Regel: kolommen in SELECT

Elke kolom in SELECT die geen aggregatiefunctie is, moet in GROUP BY staan. Anders geeft de database een fout of willekeurige waarden.

Stap 3 / 6

HAVING — groepen filteren

HAVING filtert groepen na GROUP BY. WHERE kan geen aggregatiefuncties gebruiken — HAVING wel.

WHERE — filtert rijen
-- Filtert VOOR het groeperen
SELECT categorie, COUNT(*)
FROM producten
WHERE prijs > 50
GROUP BY categorie;
HAVING — filtert groepen
-- Filtert NA het groeperen
SELECT categorie, COUNT(*)
FROM producten
GROUP BY categorie
HAVING COUNT(*) >= 2;
WHERE + GROUP BY + HAVING samen
-- Categorieën met gemiddelde prijs > 100,
-- waarbij we goedkope producten (< 30) eerst uitsluiten
SELECT
    categorie,
    COUNT(*)   AS aantal,
    AVG(prijs) AS gem_prijs
FROM producten
WHERE prijs >= 30
GROUP BY categorie
HAVING AVG(prijs) > 100
ORDER BY gem_prijs DESC;
Volledige volgorde van clausules
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
Stap 4 / 6

Aliassen & afronden

Met AS geef je kolommen een leesbare naam. Met ROUND() rond je decimalen af.

AS — kolomalias
SELECT
    COUNT(*)           AS totaal_producten,
    ROUND(AVG(prijs), 2) AS gemiddelde_prijs,
    SUM(voorraad)      AS totale_voorraad
FROM producten;
Tabel-alias — handig bij lange namen
-- p is een alias voor producten
SELECT p.naam, p.prijs
FROM producten AS p
WHERE p.prijs > 100;
Praktijkvoorbeeld — dashboard statistieken
SELECT
    COUNT(*)                AS totaal_gebruikers,
    SUM(actief)             AS actieve_gebruikers,
    ROUND(AVG(leeftijd), 1) AS gemiddelde_leeftijd,
    MIN(leeftijd)           AS jongste,
    MAX(leeftijd)           AS oudste
FROM gebruikers;
Stap 5 / 6

Oefening — statistieken berekenen

🎯 Opdrachten
  1. Hoeveel producten zijn er per categorie?
  2. Wat is de gemiddelde prijs van alle producten?
  3. Welke categorieën hebben een gemiddelde prijs boven €100? (HAVING)
  4. Wat is de totale voorraadwaarde (prijs × voorraad) van alle producten?
Resultaat verschijnt hier...

🧠 Kennischeck

📈

Les 6 afgerond!

Je berekent nu statistieken en groepeert data — de basis van elk dashboard en rapport.

Les 7: JOINs →