Database
 sql >> Datenbank >  >> RDS >> Database

SQL HAVING-Klausel für Anfänger

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)