I SQL, HAVING
sats kan användas för att ange ett sökvillkor för en grupp eller ett aggregat.
HAVING
satsen används vanligtvis med GROUP BY
klausul. I de fall det inte är det, finns det en implicit enskild, aggregerad grupp.
HAVING
satsen liknar WHERE
sats, förutom att WHERE
filtrerar enskilda rader, medan HAVING
filtrerar grupper. WHERE
klausul filtrerar data före den är grupperad, medan HAVING
filtrerar data efter den är grupperad.
Exempel 1 – HAV
med COUNT()
Anta att vi har följande tabell:
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 kan köra följande fråga mot den här tabellen:
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 det här fallet använde vi HAVING
sats i kombination med GROUP BY
sats för att returnera bara de rader som har en COUNT(PetTypeId)
större än 2
. Detta använder COUNT()
funktion, som är en aggregerad SQL-standardfunktion tillgänglig i de flesta större RDBMS:er.
Om vi utelämnar HAVING
klausul får vi ett resultat till:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Resultat:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Exempel 2 – HAV
med SUM()
Här är ett annat exempel. Den här gången använder vi HAVING
sats med SUM()
funktion, som är en annan aggregatfunktion tillgänglig i de flesta större RDBMS:er (se SQLite SUM()
för ett annat exempel).
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 | +---------------+-----------------+--------------+
Exempel 3 – HAV
med IN
Operatör
Du är inte begränsad till bara ) Operatör för nybörjare">större än operatör (> ) när du använder
HAVING
klausul. Du kan använda samma operatorer som du kan använda med WHERE
klausul (som =
, ) Operatör för nybörjare"><
, =) Operatör för nybörjare">>=
, IN
, GILLA
, etc).
Här är ett exempel som använder IN
operatorn för att ange ett intervall av aggregerade värden som ska returneras.
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 | +---------------+-----------------+--------------+
Exempel 4 – HAV
utan en GROUP BY
Klausul
Även om HAV
används vanligtvis med GROUP BY
klausul kan den också användas utan den. När den används utan den finns det en implicit enkel, aggregerad grupp.
Resultaten du får kan bero på ditt DBMS, men här är ett exempel som gjordes i SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Resultat:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Detta exempel returnerar helt enkelt den aggregerade befolkningen för alla städer i tabellen.
Det här är vad som händer om vi byter ut operatorn större än (> ) med en mindre än-operator (
<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Resultat:
(0 rows affected)