Cláusula HAVING de PostgreSQL

La cláusula HAVING nos permite filtrar los datos de cada grupo después de la agrupación.

La cláusula WHERE establece condiciones en las columnas seleccionadas, mientras que la cláusula HAVING establece condiciones en los grupos creados por la cláusula GROUP BY.

Sintaxis

La siguiente es la posición de la cláusula HAVING en una consulta SELECT:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

La cláusula HAVING debe colocarse después de la cláusula GROUP BY y antes de la cláusula ORDER BY. A continuación se muestra la sintaxis básica de la cláusula HAVING en una sentencia SELECT:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

Ejemplos

Crear la tabla COMPANY (Descargar el archivo SQL de COMPANY), con los siguientes datos:

ejemplodb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

El siguiente ejemplo encontrará los datos agrupados según el valor del campo NAME, yname (nombre)Datos con recuento del campo menor que 2:

SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;

Se obtienen los siguientes resultados:

  name
 -------
  Teddy
  Paul
  Mark
  David
  Allen
  Kim
  James
(7 rows)

Agregamos algunos datos a la tabla:

INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);

En este momento, los registros de la tabla COMPANY son los siguientes:

 id | name  | age | address      | salary
 ----+-------+-----+--------------+--------
   1 | Paul  |  32 | California   |  20000
   2 | Allen |  25 | Texas        |  15000
   3 | Teddy |  23 | Norway       |  20000
   4 | Mark  |  25 | Rich-Mond    |  65000
   5 | David |  27 | Texas        |  85000
   6 | Kim   |  22 | South-Hall   |  45000
   7 | James |  24 | Houston      |  10000
   8 | Paul  |  24 | Houston      |  20000
   9 | James |  44 | Norway       |   5000
  10 | James |  45 | Texas        |   5000
(10 rows)

El siguiente ejemplo encontrará los datos agrupados según el valor del campo name, y cuyo recuento de nombres sea mayor que 1:

ejemplodb-# SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) > 1;

Se obtienen los siguientes resultados:

 name
-------
 Paul
 James
(2 rows)
Otras extensiones