PostgreSQL - Cláusula HAVING

La cláusula HAVING nos permite seleccionar filas particulares donde el resultado de la función cumple alguna condición.

La cláusula WHERE coloca condiciones en las columnas seleccionadas, mientras que la cláusula HAVING coloca 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 seguir la cláusula GROUP BY en una consulta y también debe preceder a la cláusula ORDER BY si se utiliza. La siguiente es la sintaxis de la instrucción SELECT, incluida la cláusula HAVING:

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

Ejemplo

Considere la tabla EMPRESA que tiene registros de la siguiente manera:

# 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 es un ejemplo, que mostraría un registro para el que el número de nombres es menor que 2 -

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

Esto produciría el siguiente resultado:

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

Ahora, creemos tres registros más en la tabla EMPRESA utilizando las siguientes declaraciones INSERT:

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);

Ahora, nuestra tabla tiene los siguientes registros con nombres duplicados:

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 es el ejemplo, que mostraría el registro para el que el número de nombres es mayor que 1:

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

Esto produciría el siguiente resultado:

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