Inleiding tot SQL HEBT clausule
De zeer fundamentele vraag die in de geest opkomt, is wat is deze clausule? Welnu, de HAVING-clausule wordt gebruikt om de resultaten van een SQL-query met geaggregeerde functies uit te filteren. Om het in gewoon Engels te begrijpen, beveelt het de SQL-parser 'Hey SQL, haal me uit onze tabel met klantgegevens de namen van landen met meer dan 1 miljoen klanten'.
Wacht, dat is wat de WHERE-clausule doet, niet? Ja, dat lijkt erg op de werking van de WHERE-clausule, maar met een klein verschil. De WHERE-clausule werkt niet met geaggregeerde functies.
Om het nog wat kort te houden over geaggregeerde functies, dit zijn functies die meerdere rijen als invoer gebruiken en een meer verwerkte uitvoer opleveren. Enkele voorbeelden zijn Count (), Sum (), Min (), Max (), Avg () etc.
Waarom HEBBEN en niet WAAR?
We zien dat clausules HAVING en WHERE een zeer vergelijkbare taak uitvoeren om de resultaten uit te filteren. Wat was dan de behoefte aan de clausule HAVING? Waarom kan de WHERE-clausule niet worden gebruikt met geaggregeerde functies?
Om dit te beantwoorden, zouden we moeten begrijpen hoe de SQL-engine de twee clausules behandelt. De clausule FROM in elke SQL-opdracht vertelt de engine waar de rijen moeten worden gelezen. De gegevens worden op de schijf opgeslagen en voor verwerking in het geheugen opgehaald. Omdat de rijen één voor één worden gelezen van de schijf naar het geheugen, worden ze gecontroleerd op de WHERE-component. De rijen die niet voldoen aan de WHERE-component worden niet in het geheugen geladen. De WHERE-component wordt dus geëvalueerd voor elke rij terwijl deze wordt verwerkt door de SQL-engine.
Integendeel, de clausule HAVING komt pas in beeld nadat de rijen in het geheugen zijn geladen. Eenmaal in het geheugen geladen, voeren de aggregatiefuncties hun taak uit op de rijen met de gewenste voorwaarde.
Als we nu een WHERE-clausule zouden plaatsen met de aggregatiefunctie zoals avg (), zou dit de SQL-engine verwarren over het al dan niet opnemen van de rij voor het berekenen van het gemiddelde. In wezen zouden we de motor opdracht geven de rij niet te lezen, omdat deze niet aan de criteria avg () in de clausule WHERE heeft voldaan. Maar ja, om te bepalen of de berekeningscriteria van avg () zijn geslaagd of niet, moet de rij in het geheugen worden gelezen. Een impasse.
De syntaxis
SELECT
FROM
Klanten ID | Klantnaam | stad | land |
1 | Anja Damian | Berlijn | Duitsland |
2 | Denny Cockett | México DF | Mexico |
3 | Eleanor Calnan | México DF | Mexico |
4 | Albertha Albury | Londen | UK |
5 | Latisha Nembhard | Luleå | Zweden |
6 | Madalene Bing | Mannheim | Duitsland |
7 | Rebecka Beegle | Straatsburg | Frankrijk |
8 | Rosy Tippie | Madrid | Spanje |
9 | Audie Khan | Marseille | Frankrijk |
10 | Hildegard Burrowes | Tsawassen | Canada |
11 | Cordell Dutremble | Londen | UK |
12 | Nora Reyna | Buenos Aires | Argentinië |
13 | Ursula Laforest | México DF | Mexico |
14 | Claudie Neel | Bern | Zwitserland |
15 | Portia Yee | São Paulo | Brazilië |
16 | Angila Segarra | Londen | UK |
17 | Lise Wexler | Aachen | Duitsland |
18 | Ned Mendivil | Nantes | Frankrijk |
19 | Sara Vidaurri | Londen | UK |
20 | Tayna Navin | Graz | Oostenrijk |
21 | Pura Ray | São Paulo | Brazilië |
22 | Erika Byard | Madrid | Spanje |
23 | Jimmie Luke | Lille | Frankrijk |
24 | Shayla Byington | Bräcke | Zweden |
25 | Christiana Boden | München | Duitsland |
26 | Irina Nitta | Nantes | Frankrijk |
27 | Bryanna Alls | Torino | Italië |
28 | Norah Picken | Lisboa | Portugal |
29 | Moriah Stwart | Barcelona | Spanje |
30 | Idella Harriott | Sevilla | Spanje |
Order ID | Klanten ID | Besteldatum |
10254 | 14 | 1996/11/07 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 1996/12/08 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 1996/04/09 |
10303 | 30 | 1996/11/09 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 1996/10/10 |
10327 | 24 | 1996/11/10 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 1996/06/11 |
10351 | 20 | 1996/11/11 |
10352 | 28 | 1996/12/11 |
10355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 1996/03/12 |
10378 | 24 | 1996/10/12 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 1997/02/01 |
10403 | 20 | 1997/03/01 |
10408 | 23 | 1997/08/01 |
10410 | 10 | 1997/10/01 |
10411 | 10 | 1997/10/01 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 1997/03/02 |
10435 | 16 | 1997/04/02 |
10436 | 7 | 1997/05/02 |
10442 | 20 | 1997/11/02 |
Nu willen we klanten weten uit welke landen in totaal 5 of meer bestellingen bij ons hebben geplaatst. Het kan een enkele klant zijn die meer dan 5 bestellingen plaatst of 5 klanten die elk 1 bestelling plaatsen.
Om dit te bereiken, zouden we moeten
Stap 1 : Doe mee met de twee tafels
Stap 2: Groepeer de klanten op basis van hun land
Stap 3: Tel het aantal bestellingen voor elke groep
Stap 4: filter de resultaten voor 5 of meer bestellingen
Laten we het commando formuleren:
SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC
Dit zijn de resultaten:
land | Aantal bestellingen |
Oostenrijk | 10 |
Frankrijk | 9 |
Zweden | 7 |
Duitsland | 6 |
UK | 6 |
Conclusie - SQL-clausule
We hebben dus gezien wat het doel van de HAVING-clausule is en hoe het werkt. Het is belangrijk om de basiswerking te begrijpen, anders raakt u misschien in de war over waarom de HAVING-clausule niet de gewenste resultaten oplevert. Blijf spelen met verschillende tafels en joins en combinaties samen met de clausule HAVING.
Aanbevolen artikelen
Dit is een handleiding voor de SQL HAVING-clausule. Hier bespreken we de werking van de HAVING-clausule in SQL en een voorbeeld met de volgende tabel met klanten. U kunt ook onze andere voorgestelde artikelen doornemen -
- Query invoegen
- Buitenlandse sleutel in SQL
- Onderscheid sleutelwoord in SQL
- SQL-weergaven
- Top 6 Query-voorbeelden van Inner Join in Oracle