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

Clausola SQL HAVING per principianti

In SQL, il HAVING La clausola può essere utilizzata per specificare una condizione di ricerca per un gruppo o un aggregato.

Il HAVING La clausola viene in genere utilizzata con GROUP BY clausola. Nei casi in cui non lo è, esiste un singolo gruppo aggregato implicito.

Il HAVING la clausola è simile a WHERE clausola, eccetto quella WHERE filtra le singole righe, mentre HAVING gruppi di filtri. Il WHERE la clausola filtra i dati prima è raggruppato, mentre HAVING filtra i dati dopo è raggruppato.

Esempio 1 – HAVING con COUNT()

Supponiamo di avere la seguente tabella:

SELECT * FROM Pets;

Risultato:

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

Potremmo eseguire la seguente query su questa tabella:

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

Risultato:

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

In questo caso, abbiamo usato il HAVING clausola unitamente al GROUP BY clausola per restituire solo quelle righe che hanno un COUNT(PetTypeId) maggiore di 2 . Questo utilizza il COUNT() funzione, che è una funzione di aggregazione standard SQL disponibile nella maggior parte dei principali RDBMS.

Se omettiamo il HAVING clausola, otteniamo un altro risultato:

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

Risultato:

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

Esempio 2 – HAVING con SUM()

Ecco un altro esempio. Questa volta utilizziamo il HAVING clausola con SUM() funzione, che è un'altra funzione aggregata disponibile nella maggior parte dei principali RDBMS (vedi SQLite SUM() per un altro esempio).

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;

Risultato:

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

Esempio 3 – HAVING con il IN Operatore

Non sei limitato al solo ) Operatore per principianti">maggiore di operatore (> ) quando si utilizza il HAVING clausola. Puoi usare gli stessi operatori che puoi usare con WHERE clausola (come = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , ecc).

Ecco un esempio che utilizza IN per specificare un intervallo di valori aggregati da restituire.

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;

Risultato:

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

Esempio 4 – HAVING senza un GROUP BY Clausola

Sebbene HAVING viene solitamente utilizzato con GROUP BY clausola, può essere utilizzato anche senza di essa. Se utilizzato senza di esso, esiste un singolo gruppo aggregato implicito.

I risultati che ottieni possono dipendere dal tuo DBMS, ma ecco un esempio che è stato fatto in SQL Server.

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

Risultato:

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

Questo esempio restituisce semplicemente la popolazione aggregata di tutte le città nella tabella.

Ecco cosa succede se scambiamo l'operatore maggiore di (> ) con un operatore minore di (< ).

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

Risultato:

(0 rows affected)