Ir al contenido principal

La clausula HAVING

La forma general de la declaración SELECT es mejorar con la adición de la clausula HAVING:

SELECT column | expression | group_function( column | expression [ alias ] ) ,… )
FROM table
[ WHERE condition(s) ]
[ GROUP BY { col(s) | expr } ]
[ HAVING group_condition(s) ]
[ ORDER BY { col(s) | expr | numeric_pos} [ ASC | DESC ] [ NULLS FIRST | LAST ] ];

Una importante diferencia entre la clausula HAVING y otra clausula de la sentencia SELECT es que puede solo ser especificada si una clausula GROUP BY está presente. Esta dependencia es sensible debido a que filas de nivel grupo después que son restringidas. La clausula HAVING puede aparecer después de la clausula GROUP BY en la sentencia SELECT. Sin embargo, es mas común ubicar la clausula HAVING antes de la clausula GROUP BY. Todo el agrupamiento y ejecución de funciones grupo son ejecutados antes de evaluar la clausula HAVING.
La siguiente consulta muestra como la clausula HAVING es utilizada para restringir un conjunto de datos agregados. Filas de la tabla JOB_HISTORY son divididos en cuatro grupos. Las filas que satisfacen la condición de la clausula HAVING son devueltas:

SELECT department_id, job_id, count(*) total
FROM   job_history
GROUP BY department_id, job_id
HAVING COUNT(*) > 1
ORDER BY department_id, job_id;

SELECT job_id, ROUND(AVG(salary),2) PROMEDIO_SALARIO, COUNT(*)
FROM employees
GROUP BY job_id
HAVING AVG(salary) > 10000 AND COUNT(*) > 1;


La clausula HAVING puede solo ser especificada cuando una clausula GROUP BY está presente. Una clausula GROUP BY puede ser especificada sin una clausula HAVING. Condiciones múltiples  pueden ser impuestas en la clausula HAVING utilizando operadores AND, OR y NOT. La clausula HAVING restringe los datos a nivel grupo y debe contener una función grupo o una expresión que utilice una.

Comentarios