V SQL, HAVING
klauzuli lze použít k určení podmínky vyhledávání pro skupinu nebo agregaci.
HAVING
klauzule se obvykle používá s GROUP BY
doložka. V případech, kdy tomu tak není, existuje implicitní jediná agregovaná skupina.
HAVING
klauzule je podobná klauzuli WHERE
klauzule, kromě toho WHERE
filtruje jednotlivé řádky, zatímco HAVING
skupiny filtrů. WHERE
klauzule filtruje data před je seskupen, zatímco HAVING
filtruje data po je seskupena.
Příklad 1 – HAVING
s COUNT()
Předpokládejme, že máme následující tabulku:
SELECT * FROM Pets;
Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Proti této tabulce bychom mohli spustit následující dotaz:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Výsledek:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
V tomto případě jsme použili HAVING
klauzule ve spojení s GROUP BY
klauzule vrátit pouze ty řádky, které mají COUNT(PetTypeId)
větší než 2
. Toto používá COUNT()
funkce, což je standardní agregační funkce SQL dostupná ve většině hlavních RDBMS.
Pokud pomineme HAVING
klauzule, dostaneme ještě jeden výsledek:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Výsledek:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Příklad 2 – HAVING
pomocí SUM()
Zde je další příklad. Tentokrát použijeme HAVING
klauzule s SUM()
funkce, což je další agregační funkce dostupná ve většině hlavních RDBMS (viz SQLite SUM()
pro další příklad).
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;
Výsledek:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Příklad 3 – HAVING
s IN
Operátor
Nejste omezeni pouze na ) Operátor pro začátečníky”>větší než operátor (>
) při použití HAVING
doložka. Můžete použít stejné operátory, které můžete použít s WHERE
klauzule (například =
, ) Operator for Beginners"><
, =) Operator for Beginners">>=
, IN
, LIKE
, atd.).
Zde je příklad, který používá IN
operátor k určení rozsahu agregovaných hodnot, které se mají vrátit.
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;
Výsledek:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Příklad 4 – HAVING
bez GROUP BY
Ustanovení
Ačkoli HAVING
se obvykle používá s GROUP BY
doložka, lze ji použít i bez ní. Při použití bez něj existuje implicitní jediná agregovaná skupina.
Výsledky, které získáte, mohou záviset na vašem DBMS, ale zde je příklad, který byl proveden na serveru SQL.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Výsledek:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Tento příklad jednoduše vrátí celkový počet obyvatel všech měst v tabulce.
Co se stane, když zaměníme operátor větší než (>
) s operátorem menší než (<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Výsledek:
(0 rows affected)