Una HAVING
cláusula en SQL especifica que una SELECT
instrucción SQL solo debe devolver filas donde los valores agregados cumplen las condiciones especificadas .
HAVING
y a WHERE
menudo los principiantes los confunden, pero tienen diferentes propósitos. WHERE
se tiene en cuenta en una etapa anterior de la ejecución de una consulta, filtrando las filas leídas de las tablas. Si una consulta contiene GROUP BY
, los datos de las tablas se agrupan y agregan. Después de que HAVING
se aplica la operación de agregación, se filtran las filas que no coinciden con las condiciones especificadas. Por lo tanto, se WHERE
aplica a los datos leídos de las tablas y HAVING
solo se debe aplicar a los datos agregados, que no se conocen en la etapa inicial de una consulta.
Para ver la condición presente formada por la GROUP BY
cláusula, HAVING
se utiliza la cláusula. [ aclaración necesaria ]
Ejemplos de
Para devolver una lista de ID de departamento cuyas ventas totales excedieron los $ 1000 en la fecha del 1 de enero de 2000, junto con la suma de sus ventas en esa fecha:
SELECCIONE DeptID , SUM ( SaleAmount ) FROM Sales DONDE SaleDate = '01 -Jan-2000 ' GRUPO POR DeptID QUE TIENE SUMA ( SaleAmount ) > 1000
Refiriéndose a las tablas de muestra en el ejemplo de Unión , la siguiente consulta devolverá la lista de departamentos que tienen más de 1 empleado:
SELECT DepartmentName , COUNT ( * ) DE Empleado ÚNETE Departamento EN Empleado . DepartmentID = Departamento . DepartmentID GROUP BY DepartmentName QUE TIENE CONTEO ( * ) > 1 ;
HAVING
es conveniente, pero no necesario. El código equivalente al ejemplo anterior, pero sin usar HAVING
, podría verse así:
SELECT * FROM ( SELECT DepartmentName AS deptNam , COUNT ( * ) AS empCnt FROM Employee AS emp JOIN Department AS dept ON emp . DepartmentID = dept . DepartmentID GROUP BY deptNam ) AS grp WHERE grp . empCnt > 1 ;