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)