In SQL das HAVING
-Klausel kann verwendet werden, um eine Suchbedingung für eine Gruppe oder ein Aggregat anzugeben.
Das HAVING
-Klausel wird normalerweise mit GROUP BY
verwendet Klausel. In Fällen, in denen dies nicht der Fall ist, gibt es eine implizite einzelne, aggregierte Gruppe.
Das HAVING
-Klausel ähnelt der WHERE
-Klausel, außer dass WHERE
filtert einzelne Zeilen, während HAVING
filtert Gruppen. Das WHERE
-Klausel filtert Daten vorher es ist gruppiert, wohingegen HAVING
filtert Daten nach es ist gruppiert.
Beispiel 1 – HAVING
mit COUNT()
Angenommen, wir haben die folgende Tabelle:
SELECT * FROM Pets;
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Wir könnten die folgende Abfrage für diese Tabelle ausführen:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Ergebnis:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
In diesem Fall haben wir den HAVING
verwendet -Klausel in Verbindung mit GROUP BY
-Klausel, um nur die Zeilen zurückzugeben, die einen COUNT(PetTypeId)
haben größer als 2
. Dies verwendet den COUNT()
-Funktion, bei der es sich um eine SQL-Standardaggregatfunktion handelt, die in den meisten großen RDBMSs verfügbar ist.
Wenn wir das HAVING
weglassen -Klausel erhalten wir ein weiteres Ergebnis:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Ergebnis:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Beispiel 2 – HAVING
mit SUM()
Hier ist ein weiteres Beispiel. Dieses Mal verwenden wir den HAVING
-Klausel mit SUM()
Funktion, die eine weitere Aggregatfunktion ist, die in den meisten großen RDBMS verfügbar ist (siehe SQLite SUM()
für ein weiteres Beispiel).
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;
Ergebnis:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Beispiel 3 – HAVING
mit dem IN
Betreiber
Sie sind nicht nur auf den )-Operator für Anfänger“>größer-als-Operator (>
) beschränkt ) bei Verwendung des HAVING
Klausel. Sie können dieselben Operatoren verwenden, die Sie mit WHERE
verwenden können -Klausel (wie =
, ) Operator for Beginners"><
, =) Operator for Beginners">>=
, IN
, LIKE
usw.).
Hier ist ein Beispiel, das den IN
verwendet -Operator, um einen Bereich von zurückzugebenden Aggregatwerten anzugeben.
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;
Ergebnis:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Beispiel 4 – HAVING
ohne GROUP BY
Klausel
Obwohl HAVING
wird normalerweise mit GROUP BY
verwendet Klausel, es kann auch ohne sie verwendet werden. Wenn es ohne verwendet wird, gibt es eine implizite einzelne, aggregierte Gruppe.
Die Ergebnisse, die Sie erhalten, können von Ihrem DBMS abhängen, aber hier ist ein Beispiel, das in SQL Server erstellt wurde.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Ergebnis:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Dieses Beispiel gibt einfach die Gesamtbevölkerung aller Städte in der Tabelle zurück.
Folgendes passiert, wenn wir den Größer-als-Operator austauschen (>
) mit einem Kleiner-als-Operator (<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Ergebnis:
(0 rows affected)