В 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)