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 BY
agrupa las filas en grupos según los valores de lacolumna1
. - A continuación, la cláusula
HAVING
filtra 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
HAVING
para especificar la condición de filtrado para los grupos devueltos por la cláusulaGROUP BY
.