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