W SQL HAVING klauzula może być użyta do określenia warunku wyszukiwania dla grupy lub agregatu.
HAVING klauzula jest zwykle używana z GROUP BY klauzula. W przypadkach, w których tak nie jest, istnieje domniemana pojedyncza, zagregowana grupa.
HAVING klauzula jest podobna do WHERE klauzula, z wyjątkiem tego, że WHERE filtruje poszczególne wiersze, natomiast HAVING filtruje grupy. WHERE klauzula filtruje dane przed jest zgrupowany, podczas gdy HAVING filtruje dane po jest zgrupowany.
Przykład 1 – HAVING z COUNT()
Załóżmy, że mamy następującą tabelę:
SELECT * FROM Pets; Wynik:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
W tej tabeli moglibyśmy uruchomić następujące zapytanie:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC; Wynik:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
W tym przypadku użyliśmy HAVING klauzula w połączeniu z GROUP BY klauzula zwracająca tylko te wiersze, które mają COUNT(PetTypeId) większej niż 2 . Używa COUNT() function, która jest standardową funkcją agregującą SQL dostępną w większości głównych systemów zarządzania bazą danych (RDBMS).
Jeśli pominiemy HAVING klauzula, otrzymujemy jeszcze jeden wynik:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC; Wynik:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Przykład 2 – HAVING z SUM()
Oto kolejny przykład. Tym razem używamy HAVING klauzula z SUM() funkcja, która jest kolejną funkcją agregującą dostępną w większości głównych RDBMS (zobacz SQLite SUM() dla innego przykładu).
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; Wynik:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Przykład 3 – HAVING z IN Operator
Nie jesteś ograniczony tylko do operatora ) dla początkujących”>większego niż operator (> ) podczas korzystania z HAVING klauzula. Możesz użyć tych samych operatorów, których używasz z WHERE klauzula (np. = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE itp.).
Oto przykład, który używa IN operatora, aby określić zakres wartości zagregowanych do zwrócenia.
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; Wynik:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Przykład 4 – HAVING bez GROUP BY Klauzula
Chociaż HAVING jest zwykle używany z GROUP BY klauzuli, można jej używać również bez niej. Gdy jest używany bez tego, istnieje domniemana pojedyncza, zagregowana grupa.
Otrzymane wyniki mogą zależeć od twojego DBMS, ale oto przykład, który został zrobiony w SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000; Wynik:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Ten przykład po prostu zwraca łączną populację wszystkich miast w tabeli.
Oto, co się stanie, jeśli zamienimy operator większe niż (> ) z operatorem mniej niż (< ).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000; Wynik:
(0 rows affected)