I SQL er HAVING
klausul kan bruges til at angive en søgebetingelse for en gruppe eller et aggregat.
HAVING
klausul bruges typisk sammen med GROUP BY
klausul. I tilfælde, hvor det ikke er det, er der en implicit enkelt, aggregeret gruppe.
HAVING
klausulen ligner WHERE
klausul, bortset fra WHERE
filtrerer individuelle rækker, mens HAVING
filtrerer grupper. WHERE
klausul filtrerer data før den er grupperet, hvorimod HAVING
filtrerer data efter den er grupperet.
Eksempel 1 – HAR
med COUNT()
Antag, at vi har følgende tabel:
SELECT * FROM Pets;
Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Vi kunne køre følgende forespørgsel mod denne tabel:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Resultat:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
I dette tilfælde brugte vi HAVING
klausul i forbindelse med GROUP BY
klausul for kun at returnere de rækker, der har en COUNT(PetTypeId)
på større end 2
. Dette bruger COUNT()
funktion, som er en SQL-standard aggregeret funktion tilgængelig i de fleste større RDBMS'er.
Hvis vi udelader HAVING
klausul, får vi endnu et resultat:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Resultat:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Eksempel 2 – HAR
med SUM()
Her er et andet eksempel. Denne gang bruger vi HAVING
klausul med SUM()
funktion, som er en anden samlet funktion tilgængelig i de fleste større RDBMS'er (se SQLite SUM()
for et andet eksempel).
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;
Resultat:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Eksempel 3 – HAV
med IN
Operatør
Du er ikke begrænset til kun ) Operatør for begyndere">større end operatør (> ) når du bruger
HAVING
klausul. Du kan bruge de samme operatorer, som du kan bruge med WHERE
klausul (såsom =
, ) Operatør for begyndere"><
, =) Operatør for begyndere">>=
, IN
, LIKE
osv.).
Her er et eksempel, der bruger IN
operatør for at angive et interval af samlede værdier, der skal returneres.
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;
Resultat:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Eksempel 4 – HAR
uden en GROUP BY
Klausul
Selvom HAV
bruges normalt sammen med GROUP BY
klausul, kan den også bruges uden den. Når det bruges uden det, er der en implicit enkelt, aggregeret gruppe.
De resultater, du får, kan afhænge af dit DBMS, men her er et eksempel, der blev udført i SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Resultat:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Dette eksempel returnerer simpelthen den samlede befolkning for alle byer i tabellen.
Her er, hvad der sker, hvis vi bytter større end-operatoren (> ) med en mindre end-operator (
<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Resultat:
(0 rows affected)