SQL tellen hoe het werkt. SQL: HAVING-clausule. SQL HAVING-parameter: voorbeelden, syntaxis

De HAVING-clausule wordt gebruikt in combinatie met de GROUP BY-clausule. Het kan in een SELECT-instructie worden gebruikt om de records te filteren die door de GROUP BY-clausule worden geretourneerd.

HAVING-clausulesyntaxis

geaggregeerde_functie kan een functie zijn zoals SUM, COUNT, MIN of MAX.

Voorbeeld van het gebruik van de SUM-functie
Met de functie SOM kunt u bijvoorbeeld de afdelingsnaam en het verkoopbedrag (voor de betreffende afdelingen) opzoeken. De HAVING-aanbieding kan alleen die afdelingen selecteren waarvan de omzet meer dan $ 1000 bedraagt.

SELECTEER afdeling, SOM(verkoop) ALS "Totale verkoop" VAN order_details GROEPEREN OP afdeling MET SUM(verkoop) > 1000;

Voorbeeld van het gebruik van de functie AANTAL
U kunt bijvoorbeeld de functie AANTAL gebruiken om de naam van de afdeling en het aantal medewerkers (op de betreffende afdeling) op te halen die meer dan $ 25.000 per jaar verdienden. Het HAVING-voorstel zal alleen die afdelingen selecteren waar er meer dan 10 van dergelijke werknemers zijn.

Voorbeeld van het gebruik van de MIN-functie
U kunt bijvoorbeeld de functie MIN gebruiken om de afdelingsnaam en de minimale omzet voor die afdeling terug te geven. Het HAVING-voorstel zal alleen die afdelingen retourneren waarvan de omzet begint bij $35.000.

SELECTEER afdeling, MIN(salaris) ALS "Laagste salaris" VAN werknemers GROEPEREN OP afdeling MET MIN(salaris) = 35000;

Voorbeeld van het gebruik van de MAX-functie
U kunt de functie bijvoorbeeld ook gebruiken om de afdelingsnaam en de maximale omzet van de afdeling op te vragen. Het HAVING-voorstel zal alleen die afdelingen retourneren waarvan de maximale omzet minder dan $ 50.000 bedraagt.

SELECTEER afdeling, MAX(salaris) ALS "Hoogste salaris" VAN werknemers GROEPEREN OP afdeling MET MAX(salaris)< 50000 ;

In het vorige artikel hebben we gekeken. Daar schreef ik dat je met deze constructie afzonderlijke groepen kunt selecteren en voor elke groep de hierna gespecificeerde functies kunt berekenen SELECTEER. A HEBBEN maakt het mogelijk, afhankelijk van de resultaten van het uitvoeren van functies, onnodige rijen uit groepen te filteren. Laten we dit in meer detail bekijken.

Laten we ons vorige probleem niet vergeten, waarbij we de gemiddelde melkprijs voor een specifieke supermarktketen berekenden. Laten we niet alleen naar de gemiddelde prijs kijken, maar ook alleen de supermarktketens vermelden waar gemiddelde prijs onder de 38.

Voor deze filtering op basis van de resultaten van het uitvoeren van de aggregatiefunctie gebruiken we in SQL-opdracht HAVING:

SELECTEER `shop_id`, AVG(`price`) UIT `table` GROEPEREN OP `shop_id` MET AVG(`price`)< 38

Als gevolg hiervan, in plaats van 4 we zullen alleen lijnen hebben 3 :

winkel_id AVG(`prijs`)
1 37.5
2 36.0
3 37.0

Als ontwerpen GROEP DOOR dat zal het dan niet zijn HEBBEN geldt niet voor een specifieke groep, maar voor de gehele steekproef. Dit betekent dat als de voorwaarde HEBBEN wordt uitgevoerd, heeft dit geen enkel effect. En als het niet wordt uitgevoerd, zal er geen enkele resulterende rij zijn.

Laatste update: 19/07/2017

T-SQL gebruikt de instructies GROUP BY en HAVING om gegevens te groeperen, met behulp van de volgende formele syntaxis:

SELECT kolommen UIT tabel

GROEP DOOR

De GROUP BY-clausule bepaalt hoe de rijen worden gegroepeerd.

Laten we producten bijvoorbeeld groeperen op fabrikant

SELECTEER Fabrikant, COUNT(*) AS ModellenTel VAN Producten GROEPEREN OP Fabrikant

De eerste kolom in de SELECT-instructie - Manufacturer vertegenwoordigt de naam van de groep, en de tweede kolom - ModelsCount vertegenwoordigt het resultaat van de Count-functie, die het aantal rijen in de groep berekent.

Het is de moeite waard om te overwegen dat elke kolom die wordt gebruikt in een SELECT-instructie (de kolommen waarin het resultaat van aggregatiefuncties wordt opgeslagen niet meegerekend) moet worden opgegeven na de GROUP BY-clausule. In het bovenstaande geval wordt de kolom Fabrikant bijvoorbeeld opgegeven in zowel de SELECT- als de GROUP BY-clausule.

En als de SELECT-instructie een of meer kolommen selecteert en ook aggregatiefuncties gebruikt, moet u de GROUP BY-clausule gebruiken. Het volgende voorbeeld werkt dus niet omdat het geen groeperingsexpressie bevat:

SELECTEER fabrikant, COUNT(*) AS-modellen Tel VAN producten

Nog een voorbeeld: laten we een groepering toevoegen op basis van het aantal producten:

SELECTEER fabrikant, productaantal, COUNT(*) AS-modellenaantal UIT producten GROEPEREN OP fabrikant, productaantal

De GROUP BY-clausule kan op meerdere kolommen worden gegroepeerd.

Als de kolom waarop u groepeert een NULL-waarde bevat, vormen de rijen met de NULL-waarde een aparte groep.

Houd er rekening mee dat de GROUP BY-clausule na de WHERE-clausule moet komen, maar vóór de ORDER BY-clausule:

SELECTEER Fabrikant, AANTAL(*) AS ModellenAantal VAN Producten WAAR Prijs > 30000 GROEPEREN OP Fabrikant ORDER OP ModellenAantal DESC

Groepsfiltering. HEBBEN

Exploitant HEBBEN bepaalt welke groepen in het uitvoerresultaat worden opgenomen, dat wil zeggen: het filtert groepen.

Het gebruik van HAVING is in veel opzichten vergelijkbaar met het gebruik van WHERE. Alleen WHERE wordt gebruikt om rijen te filteren, HAVING wordt gebruikt om groepen te filteren.

Laten we bijvoorbeeld alle productgroepen per fabrikant zoeken waarvoor meer dan 1 model is gedefinieerd:

SELECTEER Fabrikant, COUNT(*) AS ModellenTel VAN Producten GROEPEREN OP Fabrikant MET COUNT(*) > 1

In dit geval kunnen we in één opdracht de expressies WHERE en HAVING gebruiken:

SELECTEER Fabrikant, AANTAL(*) AS ModellenAantal VAN Producten WAAR Prijs * ProductAantal > 80000 GROEPEREN OP Fabrikant MET AANTAL(*) > 1

Dat wil zeggen dat in dit geval de rijen eerst worden gefilterd: er worden producten geselecteerd waarvan de totale kosten meer dan 80.000 bedragen, waarna de geselecteerde producten worden gegroepeerd op fabrikant. En vervolgens worden de groepen zelf gefilterd - de groepen die meer dan 1 model bevatten, worden geselecteerd.

Als het nodig is om te sorteren, komt de ORDER BY-expressie na de HAVING-expressie:

SELECTEER Fabrikant, AANTAL(*) AS-modellen, SOM(ProductAantal) AS Eenheden VAN Producten WAAR Prijs * ProductAantal > 80000 GROEPEREN OP Fabrikant MET SUM(ProductAantal) > 2 BESTEL OP EENHEDEN DESC

In dit geval is de groepering per fabrikant en worden ook het aantal modellen voor elke fabrikant (Models) en het totale aantal producten voor al deze modellen (Units) geselecteerd. Aan het einde worden de groepen in aflopende volgorde gesorteerd op aantal producten.

Het heeft in zijn arsenaal veel krachtige tools voor het manipuleren van gegevens die zijn opgeslagen in de vorm van tabellen.

Ongetwijfeld is de mogelijkheid om gegevens te groeperen bij het nemen van steekproeven volgens een bepaald criterium een ​​van deze hulpmiddelen. Met HAVING kunt u, samen met de WHERE-operator, de voorwaarden bepalen voor het selecteren van gegevens die al op de een of andere manier zijn gegroepeerd.

HAVING SQL-parameter: beschrijving

Allereerst is het vermeldenswaard dat deze parameter optioneel is en uitsluitend wordt gebruikt in combinatie met de parameter GROUP BY. Zoals u zich herinnert, wordt GROUP BY gebruikt wanneer aggregatiefuncties worden gebruikt in SELECT, en de resultaten van hun berekeningen moeten worden verkregen voor bepaalde groepen. Als u met WHERE selectievoorwaarden kunt instellen voordat de gegevens worden gegroepeerd, bevat HAVING voorwaarden die direct betrekking hebben op de gegevens in de groepen zelf. Laten we voor een beter begrip eens kijken naar het voorbeeld met het circuit in de onderstaande afbeelding.

Dit is een uitstekend voorbeeld dat HAVING SQL een beschrijving geeft. Er wordt een tabel weergegeven met een lijst met productnamen, bedrijven die ze produceren en enkele andere velden. In de zoekopdracht in de rechterbovenhoek proberen we informatie te krijgen over hoeveel productartikelen elk bedrijf produceert, en in het resultaat willen we alleen die bedrijven weergeven die meer dan twee artikelen produceren. De parameter GROUP BY vormde drie groepen die correspondeerden met bedrijfsnamen, voor elk waarvan het aantal producten (rijen) werd berekend. Maar de parameter HAVING sloot met zijn voorwaarde één groep af van het resulterende monster, omdat deze niet aan de voorwaarde voldeed. Als resultaat krijgen we twee groepen die overeenkomen met bedrijven met 5 en 3 productiehoeveelheden.

Je zou je kunnen afvragen waarom je HAVING zou gebruiken als SQL WHERE heeft. Als we WHERE zouden gebruiken, zou er naar het totale aantal rijen in de tabel worden gekeken, niet naar groepen, en de voorwaarde zou in dit geval niet logisch zijn. Vaak bestaan ​​ze echter perfect naast elkaar in één verzoek.

In het bovenstaande voorbeeld kunnen we zien hoe gegevens eerst worden geselecteerd op basis van de namen van werknemers die zijn opgegeven in de WHERE-parameter, en vervolgens ondergaat het resultaat gegroepeerd in GROUP BY een extra controle op het salarisbedrag voor elke werknemer.

SQL HAVING-parameter: voorbeelden, syntaxis

Laten we eens kijken naar enkele kenmerken van de HAVING SQL-syntaxis. De beschrijving van deze parameter is vrij eenvoudig. Ten eerste wordt het, zoals al opgemerkt, uitsluitend gebruikt in combinatie met de parameter GROUP BY en wordt het onmiddellijk erna en vóór ORDER BY gespecificeerd, als dat in het verzoek voorkomt. Dit is begrijpelijk, aangezien HAVING voorwaarden definieert voor reeds gegroepeerde gegevens. Ten tweede kunnen alleen de aggregatiefuncties en velden die zijn opgegeven in de parameter GROUP BY worden gebruikt in de voorwaarde van deze parameter. Alle voorwaarden in deze parameter worden op precies dezelfde manier gespecificeerd als in het geval van WHERE.

Conclusie

Zoals u kunt zien, is er niets ingewikkelds aan deze operator. Semantisch wordt het op dezelfde manier gebruikt als WHERE. Het is belangrijk om te begrijpen dat WHERE wordt gebruikt met betrekking tot alle geselecteerde gegevens, en HAVING alleen wordt gebruikt met betrekking tot de groepen die zijn gedefinieerd in de parameter GROUP BY. We hebben een uitgebreide beschrijving van HAVING SQL gepresenteerd, wat voldoende is om er vol vertrouwen mee te kunnen werken.