ProgrammatieSQL-analist

Leg de verschillen uit tussen HAVING en WHERE in SQL. Wat is het doel van elk, hoe interageren ze met aggregatiefuncties en hoe kun je veelvoorkomende fouten bij het gebruik ervan vermijden?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

WHERE filtert rijen vóór de uitvoering van groepering en aggregaties, dat wil zeggen, het bepaalt welke records in de groepering/aggregatie worden opgenomen. HAVING filtert groepen al na het toepassen van aggregatiefuncties.

  • WHERE: aggregatiefuncties (SUM, AVG, enz.) kunnen niet worden gebruikt, omdat filtering plaatsvindt VOORDAT de groepering.
  • HAVING: aggregatiefuncties kunnen worden gebruikt, omdat filtering plaatsvindt NA de groepering.

Voorbeeld:

-- Verkrijg afdelingen met een totale salaris grotere dan 50000, exclusief vertrokken medewerkers SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;

Hier:

  • WHERE status = 'active' — verwijdert vertrokken medewerkers vóór het berekenen van de sommen per afdeling;
  • HAVING SUM(salary) > 50000 — toont alleen die afdelingen waar het totale salaris hoger is dan 50000.

Misleidende vraag

Kun je aggregatiefuncties gebruiken in WHERE?

Fout: men probeert te schrijven WHERE SUM(amount) > 100, maar dat kan niet — aggregatiefuncties worden SLECHTS in HAVING toegepast.

Voorbeeld (NIET goed):

SELECT customer_id, SUM(amount) FROM orders WHERE SUM(amount) > 100 GROUP BY customer_id -- FOUT: onjuist gebruik van SUM() in WHERE

Goed:

SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id HAVING SUM(amount) > 100;

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp


Verhaal

CRM-ontwikkeling. Poging om klanten met meer dan 5 bestellingen te filteren via WHERE COUNT(order_id) > 5. De query werkte niet. Resultaat: het aantal klanten in het rapport was onjuist, omdat COUNT niet kan worden gebruikt in WHERE.


Verhaal

Businessanalyse. In plaats van inactieve producten in WHERE te filteren, gebruikten ze HAVING. Resultaat: aggregatie van "lege" groepen en trage SQL. Dit werd opgelost door de statusfilter naar WHERE te verplaatsen.


Verhaal

Complex rapport. HAVING zonder GROUP BY gebruikt voor het filteren van afzonderlijke rijen. In sommige databases leidt dit tot een fout, in andere tot onduidelijk gedrag. Conclusie: HAVING moet na de groepering komen en voor aggregatievoorwaarden worden gebruikt.