В SQL, HAVING
клаузата може да се използва за определяне на условие за търсене за група или агрегат.
HAVING
клаузата обикновено се използва с GROUP BY
клауза. В случаите, когато не е, има имплицитна единична, агрегирана група.
HAVING
Клаузата е подобна на WHERE
клауза, с изключение на WHERE
филтрира отделни редове, докато HAVING
филтрира групи. WHERE
клаузата филтрира данни преди той е групиран, докато HAVING
филтрира данни след то е групирано.
Пример 1 – HAVING
с COUNT()
Да предположим, че имаме следната таблица:
SELECT * FROM Pets;
Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Можем да изпълним следната заявка към тази таблица:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Резултат:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
В този случай използвахме HAVING
клауза във връзка с GROUP BY
клауза за връщане само на онези редове, които имат COUNT(PetTypeId)
от по-голямо от 2
. Това използва COUNT()
функция, която е стандартна SQL агрегатна функция, налична в повечето основни RDBMS.
Ако пропуснем HAVING
клауза, получаваме още един резултат:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Резултат:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Пример 2 – HAVING
с SUM()
Ето още един пример. Този път използваме HAVING
клауза с SUM()
функция, която е друга обобщена функция, налична в повечето основни RDBMS (вижте SQLite SUM()
за друг пример).
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;
Резултат:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Пример 3 – HAVING
с IN
Оператор
Не сте ограничени само до ) Оператор за начинаещи”>по-голям от оператора (>
), когато използвате HAVING
клауза. Можете да използвате същите оператори, които можете да използвате с WHERE
клауза (като =
, ) Operator for Beginners"><
, =) Operator for Beginners">>=
, IN
, LIKE
и др.).
Ето пример, който използва IN
оператор, за да посочите диапазон от обобщени стойности, които да се връщат.
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;
Резултат:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Пример 4 – HAVING
без GROUP BY
Клауза
Въпреки че HAVING
обикновено се използва с GROUP BY
клауза, може да се използва и без него. Когато се използва без него, има имплицитна единична, агрегирана група.
Резултатите, които получавате, може да зависят от вашата СУБД, но ето пример, направен в SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Резултат:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Този пример просто връща общото население на всички градове в таблицата.
Ето какво се случва, ако сменим оператора по-голямо от (>
) с оператор по-малко от (<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Резултат:
(0 rows affected)