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)