sql >> Database teknologi >  >> RDS >> Database

SQL HAVING-klausul for begyndere

I SQL er HAVING klausul kan bruges til at angive en søgebetingelse for en gruppe eller et aggregat.

HAVING klausul bruges typisk sammen med GROUP BY klausul. I tilfælde, hvor det ikke er det, er der en implicit enkelt, aggregeret gruppe.

HAVING klausulen ligner WHERE klausul, bortset fra WHERE filtrerer individuelle rækker, mens HAVING filtrerer grupper. WHERE klausul filtrerer data før den er grupperet, hvorimod HAVING filtrerer data efter den er grupperet.

Eksempel 1 – HAR med COUNT()

Antag, at vi har følgende tabel:

SELECT * FROM Pets;

Resultat:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Vi kunne køre følgende forespørgsel mod denne tabel:

SELECT 
    PetTypeId, 
    COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;

Resultat:

+-------------+---------+
| PetTypeId   | Count   |
|-------------+---------|
| 3           | 4       |
| 2           | 3       |
+-------------+---------+

I dette tilfælde brugte vi HAVING klausul i forbindelse med GROUP BY klausul for kun at returnere de rækker, der har en COUNT(PetTypeId) på større end 2 . Dette bruger COUNT() funktion, som er en SQL-standard aggregeret funktion tilgængelig i de fleste større RDBMS'er.

Hvis vi udelader HAVING klausul, får vi endnu et resultat:

SELECT 
    PetTypeId, 
    COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;

Resultat:

+-------------+---------+
| PetTypeId   | Count   |
|-------------+---------|
| 3           | 4       |
| 2           | 3       |
| 1           | 1       |
+-------------+---------+

Eksempel 2 – HAR med SUM()

Her er et andet eksempel. Denne gang bruger vi HAVING klausul med SUM() funktion, som er en anden samlet funktion tilgængelig i de fleste større RDBMS'er (se SQLite SUM() for et andet eksempel).

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;

Resultat:

+---------------+-----------------+--------------+
| CountryCode   | District        | Population   |
|---------------+-----------------+--------------|
| AGO           | Luanda          | 2022000      |
| AUS           | New South Wales | 3993949      |
| AUS           | Queensland      | 1805236      |
| AUS           | Victoria        | 2990711      |
| AUS           | West Australia  | 1096829      |
+---------------+-----------------+--------------+

Eksempel 3 – HAV med IN Operatør

Du er ikke begrænset til kun ) Operatør for begyndere">større end operatør (> ) når du bruger HAVING klausul. Du kan bruge de samme operatorer, som du kan bruge med WHERE klausul (såsom = , ) Operatør for begyndere">< , =) Operatør for begyndere">>= , IN , LIKE osv.).

Her er et eksempel, der bruger IN operatør for at angive et interval af samlede værdier, der skal returneres.

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;

Resultat:

+---------------+-----------------+--------------+
| CountryCode   | District        | Population   |
|---------------+-----------------+--------------|
| AGO           | Luanda          | 2022000      |
| AUS           | New South Wales | 3993949      |
| AUS           | Victoria        | 2990711      |
+---------------+-----------------+--------------+

Eksempel 4 – HAR uden en GROUP BY Klausul

Selvom HAV bruges normalt sammen med GROUP BY klausul, kan den også bruges uden den. Når det bruges uden det, er der en implicit enkelt, aggregeret gruppe.

De resultater, du får, kan afhænge af dit DBMS, men her er et eksempel, der blev udført i SQL Server.

SELECT
    SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;

Resultat:

+--------------+
| Population   |
|--------------|
| 1429559884   |
+--------------+

Dette eksempel returnerer simpelthen den samlede befolkning for alle byer i tabellen.

Her er, hvad der sker, hvis vi bytter større end-operatoren (> ) med en mindre end-operator (< ).

SELECT
    SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;

Resultat:

(0 rows affected)


  1. MySQL-forbindelse over SSH-tunnel - hvordan specificeres anden MySQL-server?

  2. 15 Nyttige MySQL/MariaDB-tip til justering af ydeevne og optimering

  3. Flere af mine foretrukne PostgreSQL-forespørgsler - og hvorfor de også betyder noget

  4. Gyldig datotjek i Oracle