Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

HAVING E SUBCONSULTAS

A instrutora usou o seguinte código:

SELECT * FROM produtos GROUP BY nome, preco HAVING preco > ( SELECT AVG(preco) FROM produtos);

Pela explicação da instrutora, entendi que por estar trabalhando com AVG() que é uma estrutura de agregação o ideal seria usar HAVING.

Entretanto AVG está presente na subconsulta e não interfere no HAVING que está na consulta principal ou superior.

Tanto é que o código com WHERE:

SELECT * FROM produtos WHERE preco > ( SELECT AVG(preco) FROM produtos) ORDER by preco);

retorna o mesmo resultado do código com HAVING.

Não consegui entender a necessidade de usar o HAVING no lugar de WHERE, na consulta principal, quando a subconsulta tem uma função de agregação, no caso o AVG()

1 resposta
solução!

Boa noite Orlando, tudo bem contigo ?

A cláusula HAVING foi adicionada ao SQL porque a palavra-chave WHERE não pode ser usada com funções agregadas. Na verdade, a cláusula WHERE vai servir para selecionar os valores que serão agrupados e o HAVING faz um filtro dentro dessa seleção. Então, em resumo o HAVING faz um filtro nos valores após o GROUP BY. E qual seria então a diferença do WHERE ? O WHERE não pode ser utilizado com o GROUP BY, ou seja, APÓS o GROUP BY, pois não existe essa sintaxe no padrão SQL, logo se você fizer isso dará um erro de execução

Espero ter ajudado, bons estudos!!!