A cláusula HAVING filtra resultados obtidos pela cláusula GROUP BY.
No exemplo a seguir, a cláusula HAVING COUNT(*) > 4 exclui do resultado final todos os departamentos com quatro membros ou menos.
SELECT DEPT
, AVG(SALARY)
FROM Q.STAFF
GROUP BY DEPT
HAVING COUNT(*) > 4
A consulta gera este relatório:
DEPT COL1
------ ------------------
38 15457.1100000000
51 17218.1600000000
66 17215.2400000000
Tanto WHERE quanto HAVING eliminam os dados indesejados do relatório.
A condição WHERE é usada com seleção de coluna.
Ela determina se uma linha individual é incluída.
A condição HAVING é usada com funções embutidas.
Ela determina se um grupo inteiro é incluído.
HAVING é sempre seguida de uma função de coluna (como SUM, AVG, MAX, MIN ou COUNT).
HAVING também pode ser seguida de uma subconsulta que encontra um valor agrupado para completar a condição HAVING.
Use WHERE para excluir dados de linha não desejados e HAVING para excluir dados agrupados não desejados.
Exemplo:
- Isto é correto: HAVING MIN(YEARS) > 6
- Isto é incorreto: HAVING YEARS > 6
Exemplos adicionais:
- Para listar o salário menor, maior e médio em cada departamento, excluindo os gerentes, para departamentos com uma média salarial maior do que $12.000, use
uma consulta como a seguinte:
SELECT DEPT
, MIN(SALARY)
, MAX(SALARY)
, AVG(SALARY)
FROM Q.STAFF
WHERE JOB <> 'MGR'
GROUP BY DEPT
HAVING AVG(SALARY) > 12000
Essa consulta produz o seguinte relatório:
DEPT COL1 COL2 COL3
------ ----------- ---------- ------------------
15 12258.50 16502.83 13756.5100000000
20 13504.60 18171.25 15309.5333333333
38 12009.75 18006.00 14944.7000000000
42 10505.90 18001.75 13338.7500000000
51 13369.80 19456.50 16235.2000000000
66 10988.00 21000.00 16880.1750000000
84 13030.50 17844.00 15443.0000000000
A palavra-chave HAVING só pode ser utilizada com os dados agrupados.
Quando as cláusulas HAVING e GROUP BY estiverem sendo usadas, a cláusula HAVING deve acompanhar a cláusula GROUP BY.
- Para listar, para cada número de anos de serviço, o número de funcionários com aquele número de anos e seus salários médios, mas apenas para grupos com mais
de dois funcionários, use uma consulta como a seguinte:
SELECT YEARS
, COUNT(*)
, AVG(SALARY)
FROM Q.STAFF
GROUP BY YEARS
HAVING COUNT(*) > 2
Essa consulta produz o seguinte relatório:
YEARS COL1 COL2
------ ----------- ------------------
5 5 15552.0400000000
6 6 16930.0250000000
7 6 18611.8050000000
10 3 20162.6000000000
- 4 13694.0625000000
Veja também:
© Copyright IBM Corp.