En SQL, HAVING
La cláusula se puede utilizar para especificar una condición de búsqueda para un grupo o un agregado.
El HAVING
La cláusula se usa típicamente con GROUP BY
cláusula. En los casos en que no lo es, hay un único grupo agregado implícito.
El HAVING
la cláusula es similar a WHERE
cláusula, excepto que WHERE
filtra filas individuales, mientras que HAVING
grupos de filtros. El WHERE
la cláusula filtra los datos antes está agrupado, mientras que HAVING
filtra los datos después está agrupado.
Ejemplo 1:HAVING
con COUNT()
Supongamos que tenemos la siguiente tabla:
SELECT * FROM Pets;
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Podríamos ejecutar la siguiente consulta en esta tabla:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Resultado:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
En este caso, usamos el HAVING
cláusula junto con GROUP BY
cláusula para devolver solo aquellas filas que tienen un COUNT(PetTypeId)
mayor que 2
. Esto usa el COUNT()
función, que es una función agregada estándar de SQL disponible en la mayoría de los principales RDBMS.
Si omitimos el HAVING
cláusula, obtenemos un resultado más:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Resultado:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Ejemplo 2:HAVING
con SUM()
Aquí hay otro ejemplo. Esta vez usamos el HAVING
cláusula con SUM()
función, que es otra función agregada disponible en la mayoría de los principales RDBMS (ver SQLite SUM()
para otro ejemplo).
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;
Resultado:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Ejemplo 3:HAVING
con el IN
Operador
No está limitado solo al operador ) para principiantes”>operador mayor que (>
) cuando se usa HAVING
cláusula. Puede usar los mismos operadores que puede usar con WHERE
cláusula (como =
, ) Operator for Beginners"><
, =) Operator for Beginners">>=
, IN
, LIKE
, etc.).
Aquí hay un ejemplo que usa el IN
operador para especificar un rango de valores agregados para devolver.
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;
Resultado:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Ejemplo 4:HAVING
sin GROUP BY
Cláusula
Aunque HAVING
generalmente se usa con GROUP BY
cláusula, también se puede utilizar sin ella. Cuando se usa sin él, hay un único grupo agregado implícito.
Los resultados que obtenga pueden depender de su DBMS, pero aquí hay un ejemplo que se hizo en SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Resultado:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Este ejemplo simplemente devuelve la población agregada de todas las ciudades de la tabla.
Esto es lo que sucede si intercambiamos el operador mayor que (>
) con un operador menor que (<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Resultado:
(0 rows affected)