In SQL is de HAVING
clausule kan worden gebruikt om een zoekvoorwaarde voor een groep of een aggregaat op te geven.
De HAVING
clausule wordt meestal gebruikt met de GROUP BY
clausule. In gevallen waar dit niet het geval is, is er een impliciete enkele, geaggregeerde groep.
De HAVING
clausule is vergelijkbaar met de WHERE
clausule, behalve dat WHERE
filtert individuele rijen, terwijl HAVING
filtert groepen. De WHERE
clausule filtert gegevens voor het is gegroepeerd, terwijl HAVING
filtert gegevens na het is gegroepeerd.
Voorbeeld 1 – HAVING
met COUNT()
Stel dat we de volgende tabel hebben:
SELECT * FROM Pets;
Resultaat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
We kunnen de volgende query uitvoeren op deze tabel:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Resultaat:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
In dit geval gebruikten we de HAVING
clausule in combinatie met de GROUP BY
clausule om alleen die rijen terug te geven die een COUNT(PetTypeId)
. hebben groter dan 2
. Dit gebruikt de COUNT()
functie, een standaard SQL-aggregaatfunctie die beschikbaar is in de meeste grote RDBMS'en.
Als we de HAVING
. weglaten clausule, krijgen we nog een resultaat:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Resultaat:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Voorbeeld 2 – HAVING
met SUM()
Hier is nog een voorbeeld. Deze keer gebruiken we de HAVING
clausule met de SUM()
functie, een andere verzamelfunctie die beschikbaar is in de meeste grote RDBMS'en (zie SQLite SUM()
voor een ander voorbeeld).
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode;
Resultaat:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Voorbeeld 3 – HAVING
met de IN
Operator
Je bent niet beperkt tot alleen de ) Operator voor beginners”>groter dan operator (>
) bij gebruik van de HAVING
clausule. U kunt dezelfde operators gebruiken die u kunt gebruiken met de WHERE
clausule (zoals =
, ) Operator for Beginners"><
, =) Operator for Beginners">>=
, IN
, LIKE
, enz.).
Hier is een voorbeeld dat de IN
. gebruikt operator om een bereik van geaggregeerde waarden op te geven dat moet worden geretourneerd.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) IN (2022000, 3993949, 2990711)
ORDER BY CountryCode;
Resultaat:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Voorbeeld 4 – HAVING
zonder een GROUP BY
Clausule
Hoewel HAVING
wordt meestal gebruikt met de GROUP BY
clausule, kan het ook zonder worden gebruikt. Bij gebruik zonder is er een impliciete enkele, geaggregeerde groep.
De resultaten die u krijgt, kunnen afhankelijk zijn van uw DBMS, maar hier is een voorbeeld dat in SQL Server is gemaakt.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Resultaat:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Dit voorbeeld retourneert eenvoudig de totale bevolking van alle steden in de tabel.
Dit gebeurt er als we de operator groter dan (>
.) omwisselen ) met een operator kleiner dan (<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Resultaat:
(0 rows affected)