HAVING versus WHERE
Filteren vóór of na het groeperen en bepalen welke component de aggregatie ziet
HAVING versus WHERE is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op programmeerinterviews. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
De vraag die je krijgt
'Wat is het verschil tussen WHERE en HAVING?' is een van de meest gestelde SQL-sollicitatievragen. Een zwak antwoord zegt: 'HAVING is voor aggregaten.' Een sterk antwoord legt uit wanneer elke clausule wordt uitgevoerd in de queryverwerkingspijplijn.
Dat moment is het hele verhaal: WHERE filtert rijen voordat ze worden gegroepeerd; HAVING filtert groepen na de aggregatie.
Waar ze in de uitvoeringsvolgorde staan
Herhaal de logische uitvoeringsvolgorde van een query:
FROM/JOIN→ de verzameling rijen opbouwenWHERE→ afzonderlijke rijen filterenGROUP BY→ samenvoegen tot groepenHAVING→ de groepen filterenSELECT→ kolommen projecterenORDER BY→ sorteren
WHERE wordt uitgevoerd voordat er groepen bestaan; HAVING daarna. Daarom kan HAVING aggregaten zien en WHERE niet.
WHERE kan geen aggregaten zien
Omdat WHERE vóór het groeperen wordt uitgevoerd, zijn er nog geen geaggregeerde waarden beschikbaar. WHERE COUNT(*) > 5 schrijven is een syntaxisfout in elke database die de standaard volgt.
Interviewers zetten expres precies deze regel in om te controleren of je de verwerkingspijplijn begrijpt. Het aggregaat bestaat nog niet wanneer WHERE wordt geëvalueerd.
-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;HAVING filtert de groepen
Verplaats de aggregaatvoorwaarde naar HAVING en het werkt, omdat HAVING wordt uitgevoerd nadat de groepen en hun aggregaten zijn berekend.
Lees het als: 'groepeer de medewerkers en houd daarna alleen afdelingen over waarvan het aantal groter is dan vijf.'
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Zet rijfilters in WHERE
De omgekeerde fout is dat je onbewerkte rijen in HAVING filtert. Dat levert vaak het juiste antwoord op, maar is trager en misleidend, omdat je rijen hebt gegroepeerd die je wilde weggooien.
Vuistregel: filteren op een waarde van een onbewerkte kolom → WHERE. Filteren op een aggregaat → HAVING. Door rijen vroeg te filteren, verklein je de hoeveelheid gegevens die de groepering moet verwerken.
-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;Beide clausules samen
Een volledige query gebruikt vaak beide clausules. WHERE beperkt eerst het aantal rijen; HAVING houdt daarna alleen groepen over die aan de voorwaarden voldoen. Van boven naar beneden lezen komt overeen met de logische volgorde.
Uitgewerkt voorbeeld: zoek onder de bestellingen die dit jaar zijn geplaatst de klanten die in totaal meer dan 1000 hebben uitgegeven.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING SUM(amount) > 1000;HAVING op niet-geaggregeerde kolommen
HAVING kan naar een groeperingskolom verwijzen, niet alleen naar aggregaten. HAVING department = 'Sales' is toegestaan, maar zinloos: die filter hoort in WHERE, zodat hij eerder wordt uitgevoerd.
Als een interviewer je een HAVING laat zien die een gewone gegroepeerde kolom filtert, is de verwachte kritiek: 'verplaats die naar WHERE voor meer efficiëntie.'
-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';HAVING zonder GROUP BY
Een subtiel geval: HAVING is ook zonder GROUP BY toegestaan. De hele tabel wordt één impliciete groep en HAVING filtert die ene groep.
Als de aggregaatvoorwaarde onwaar is, krijg je nul rijen; als ze waar is, krijg je één rij. Dit is zelden nuttig, maar interviewers vragen ernaar om te controleren of je het concept van een impliciete groep begrijpt.
-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;Kan HAVING een SELECT-alias gebruiken?
Net als bij de truc met het bereik van aliassen elders verschillen dialecten. Postgres en MySQL staan toe dat HAVING naar een SELECT-alias verwijst; SQL Server en Oracle niet.
De meest database-onafhankelijke aanpak is om de aggregaatexpressie in HAVING te herhalen. Dat werkt in elk databasesysteem en voorkomt verrassingen in een sollicitatiegesprek over meerdere databases.
-- Portable: repeat the aggregate, do not rely on the alias
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region
HAVING SUM(amount) > 5000;Prestaties benaderen
Om indruk te maken, verbind je de clausules met prestaties: WHERE vermindert het aantal rijen dat het groeperingsmechanisme moet scannen en kan indexen gebruiken; HAVING wordt uitgevoerd op al geaggregeerde groepen en kan de kosten van het groeperen dus niet verlagen.
Het kernpunt dat interviewers willen horen: verplaats elke filter zo vroeg mogelijk. Alleen voorwaarden die echt van een aggregaat afhangen, hebben HAVING nodig.
Het antwoord in één zin
Onthoud dit voor het sollicitatiegesprek: 'WHERE filtert rijen voordat ze worden gegroepeerd en kan aggregaten niet zien; HAVING filtert groepen na de aggregatie en is de enige clausule die een aggregaatwaarde kan controleren.'
Volg dit op met de lijst van de uitvoeringsvolgorde en je hebt een volledig antwoord gegeven dat klinkt alsof je ervaring hebt.
Korte toets
Bepaal in welke clausule elke voorwaarde thuishoort.
Samenvatting
WHERE: filtert rijen vóór GROUP BY; aggregaten zijn niet toegestaan. HAVING: filtert groepen na de aggregatie en is de enige plek waar een aggregaatvoorwaarde is toegestaan.
- Zet filters op onbewerkte kolommen in WHERE voor snelheid en gebruik van indexen.
- HAVING kan naar gegroepeerde kolommen verwijzen, maar zou dat niet moeten doen voor gewone filters.
- HAVING werkt zonder GROUP BY op de impliciete groep van de hele tabel.
- Herhaal aggregaatexpressies in HAVING om problemen tussen verschillende dialecten te voorkomen.
Leer Voorbereiding op programmeerinterviews met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 90
- Lessen
- 360
Veelgestelde vragen
Is de les “HAVING versus WHERE” gratis?
Ja — de volledige tekst van “HAVING versus WHERE” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op programmeerinterviews wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
Wat leer ik in “HAVING versus WHERE”?
Filteren vóór of na het groeperen en bepalen welke component de aggregatie ziet Je oefent met Voorbereiding op programmeerinterviews door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Voorbereiding op programmeerinterviews te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op programmeerinterviews op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “HAVING versus WHERE”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op programmeerinterviews?
Ja. Elke les over Voorbereiding op programmeerinterviews bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- De GROUP BY-regel voor SELECT-kolommen
- HAVING versus WHERE
- Groepeer op meerdere kolommen en expressies
- Groepen tellen en filteren