La cláusula HAVING especifica una condición de búsqueda para un grupo. La cláusula HAVING se utiliza a menudo con la cláusula GROUP BY para filtrar grupos en función de una condición especificada.
La siguiente sentencia ilustra la sintaxis básica de la cláusula HAVING:
SELECT
column1,
aggregate_function (column2)
FROM
table_name
GROUP BY
column1
HAVING
condition;
En esta sintaxis:
- Primero, la cláusula
GROUP BYagrupa las filas en grupos según los valores de lacolumna1. - A continuación, la cláusula
HAVINGfiltra los grupos en función de lacondition.
Si un grupo cumple la condición especificada, la cláusula HAVING lo incluirá en el conjunto de resultados.
Además de la cláusula GROUP BY, también puede incluir otras cláusulas como JOIN y LIMIT en la sentencia que utiliza la cláusula HAVING.
PostgreSQL evalúa la cláusula HAVING después de las cláusulas FROM, WHERE, GROUP BY, y antes de las cláusulas DISTINCT, SELECT, ORDER BY y LIMIT:
Debido a que PostgreSQL evalúa la cláusula HAVING antes que la cláusula SELECT, no puede usar los alias de columna en la cláusula HAVING.
Esta restricción surge del hecho de que, en el punto de evaluación de la cláusula HAVING, los alias de columna especificados en la cláusula SELECT aún no están disponibles.
HAVING vs. WHERE¶
La cláusula WHERE filtra las filas basándose en una condición específica mientras que la cláusula HAVING filtra grupos de filas según una condición especificada.
En otras palabras, usted aplica la condición en la cláusula WHERE a las filas mientras que aplica la condición en la cláusula HAVING a los grupos de filas.
Ejemplos de la cláusula HAVING en PostgreSQL¶
Veamos la tabla payment en la base de datos de ejemplo:

Uso de la cláusula HAVING de PostgreSQL con la función SUM ejemplo¶
La siguiente consulta utiliza la cláusula GROUP BY con la función SUM() para encontrar el pago total de cada cliente:
SELECT
customer_id,
SUM (amount) amount
FROM
payment
GROUP BY
customer_id
ORDER BY
amount DESC;
Salida:
customer_id | amount
-------------+--------
148 | 211.55
526 | 208.58
178 | 194.61
137 | 191.62
...
La siguiente sentencia añade la cláusula HAVING para seleccionar los únicos clientes que han gastado más de 200:
SELECT
customer_id,
SUM (amount) amount
FROM
payment
GROUP BY
customer_id
HAVING
SUM (amount) > 200
ORDER BY
amount DESC;
Salida:
customer_id | amount
-------------+--------
148 | 211.55
526 | 208.58
(2 rows)
Ejemplo de cláusula HAVING con COUNT en PostgreSQL¶
Vea la siguiente tabla customer de la base de datos de ejemplo:

La siguiente consulta utiliza la cláusula GROUP BY para encontrar el número de clientes por tienda:
SELECT
store_id,
COUNT (customer_id)
FROM
customer
GROUP BY
store_id
Salida:
store_id | count
----------+-------
1 | 326
2 | 273
(2 rows)
La siguiente sentencia añade la cláusula HAVING para seleccionar una tienda que tenga más de 300 clientes:
SELECT
store_id,
COUNT (customer_id)
FROM
customer
GROUP BY
store_id
HAVING
COUNT (customer_id) > 300;
Salida:
store_id | count
----------+-------
1 | 326
(1 row)
Resumen¶
- Utilice la cláusula
HAVINGpara especificar la condición de filtrado para los grupos devueltos por la cláusulaGROUP BY.