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)