Saltar a contenido

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 la columna1.
  • A continuación, la cláusula HAVING filtra los grupos en función de la condition.

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:

img

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:

payment

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:

customer table

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áusula GROUP BY.