sql >> Base de Datos >  >> RDS >> Database

Cláusula SQL HAVING para principiantes

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)