HAVING pode ser considerado o “WHERE” do group by.
Na clausua HAVING podemos informar as limitações de uma query, inclusive com funções de grupo.
Vamos imaginar a seguinte query:
SELECT TABLESPACE_NAME, MAX(SAMPLE_SIZE) FROM ALL_TABLES GROUP BY TABLESPACE_NAME
Nela buscamos o maior SAMPLE_SIZE de cada TABLE_SPACE cadastrado na tabela ALL_TABLES.
Agora imagine se quisessemos apenas os valores para o tablespace SYSAUX?
Poderia ser feito, usando HAVING, da seguinte maneira:
SELECT TABLESPACE_NAME, MAX(SAMPLE_SIZE) FROM ALL_TABLES GROUP BY TABLESPACE_NAME HAVING TABLESPACE_NAME = 'SYSAUX'
Parecido com WHERE, não?
Agora vamos perguntar aqueles registros que tenham ou SAMPLE_SIZE maior que 1000 ou TABLE_SPACE igual a SYSAUX:
SELECT TABLESPACE_NAME, MAX(SAMPLE_SIZE) FROM ALL_TABLES GROUP BY TABLESPACE_NAME HAVING TABLESPACE_NAME = 'SYSAUX' OR MAX(SAMPLE_SIZE) > 1000
Vale lembrar que o HAVING sempre precede o ORDER BY.