Una HAVING
cláusula en SQL especifica que una SELECT
declaración SQL solo debe devolver filas donde los valores agregados cumplan con las condiciones especificadas . [1] : 125–127
HAVING
y WHERE
los principiantes suelen confundirlos, pero tienen propósitos diferentes. 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
, las filas de las tablas se agrupan y agregan. Después de la operación de agregación, HAVING
se aplica , filtrando las filas que no coinciden con las condiciones especificadas. Por lo tanto, WHERE
se aplica a los datos leídos de las tablas y HAVING
solo debe aplicarse a los datos agregados, que no se conocen en la etapa inicial de una consulta.
Para visualizar la condición presente formada por la GROUP BY
cláusula, HAVING
se utiliza la cláusula. [ aclaración necesaria ]
Para devolver una lista de identificaciones de departamentos cuyas ventas totales excedieron $1000 en la fecha del 1 de enero de 2000, junto con la suma de sus ventas en esa fecha:
SELECCIONAR DeptID , SUMA ( MontoDeVenta ) DE Ventas DONDE FechaDeVenta = '2000-01-01' AGRUPAR POR DeptID QUE TIENE SUMA ( MontoDeVenta ) > 1000
Haciendo referencia 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:
SELECCIONAR NombreDepartamento , CONTAR ( * ) DE Empleado UNIR Departamento EN Empleado.IDDepartamento = Departamento.IDDepartamento AGRUPAR POR NombreDepartamento QUE TIENE CONTAR ( * ) > 1 ;
HAVING
es conveniente, pero no necesario. El código equivalente al ejemplo anterior, pero sin usar HAVING
, podría verse así:
SELECCIONAR * DE ( SELECCIONAR NombreDepartamento COMO deptNam , CONTAR ( * ) COMO empCount DE Empleado COMO emp UNIR Departamento COMO dept EN emp . IDDepartamento = dept . IDDepartamento AGRUPAR POR deptNam ) COMO grp DONDE grp . empCount > 1 ;