Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

[Dúvida] HAVING

Fiquei em dúvida quanto ao GROUP BY e pedi ajuda ao chat, mas minha dúvida ficou pior acerca da necessidade dele: Claro! Vamos analisar sua consulta SQL:

sql Copiar

SELECT nome, preco FROM produtos GROUP BY nome, preco HAVING preco > (SELECT AVG(preco) FROM produtos) Para que serve o GROUP BY aqui? O que a cláusula faz? GROUP BY normalmente é usada para agrupar linhas com valores iguais em determinadas colunas, frequentemente acompanhada de funções agregadoras (como SUM, AVG, COUNT, etc). Neste caso específico Na sua consulta, GROUP BY nome, preco está agrupando os registros por cada combinação única de nome e preco. Como não há funções agregadoras (como COUNT(*), SUM(preco) ou similares no SELECT), o GROUP BY neste contexto não é estritamente necessário. A função do HAVING O HAVING é quase sempre utilizado após uma agregação para filtrar grupos. Neste caso, ele é usado para pegar os grupos cujo preço é maior que a média dos preços dos produtos. A consulta poderia funcionar sem o GROUP BY? Sim! Se nome e preco são colunas do mesmo registro, você poderia simplesmente usar:

sql Copiar

SELECT nome, preco FROM produtos WHERE preco > (SELECT AVG(preco) FROM produtos) A real necessidade do GROUP BY nesta consulta Não é necessária, já que: Não há agregação acontecendo Não está sendo utilizada nenhuma função do tipo SUM, COUNT, etc. Se o objetivo for listar todos os produtos cujo preço é maior que a média dos preços, o GROUP BY pode ser removido sem afetar o resultado.

Quando seria necessário? O GROUP BY só seria necessário se você quisesse calcular agregações por nome ou por preço, por exemplo:

sql Copiar

SELECT nome, AVG(preco) FROM produtos GROUP BY nome HAVING AVG(preco) > (SELECT AVG(preco) FROM produtos) Aqui faz sentido: estamos agrupando produtos pelo nome e comparando as médias, por isso precisamos do GROUP BY

7 respostas

Olá, Pedro! Tudo bem?

Vou te ajudar a entender melhor a cláusula GROUP BY, vamos imaginar uma tabela vendas dessa forma:

vendedorvalor
Ana100
Ana200
João150
João50
Maria400

Observou que os nomes da Ana e João aparecem registrados duas vezes na tabela?

Logo, seria válido se existisse alguma forma de agrupar os registros da Ana e João em uma consulta. É justamente isso que o GROUP BY faz!

Por exemplo, se realizássemos a seguinte consulta:

SELECT vendedor, SUM(valor) AS total_vendas
FROM vendas
GROUP BY vendedor;
  • O SQL irá retornar uma coluna vendedor e uma coluna com a soma dos valores (total_vendas)
  • Mas a coluna vendedor não será retornada de maneira comum
  • Ela será retornada de maneira agrupada (Ana, João e Maria)

Assim, temos esse resultado:

vendedortotal_vendas
Ana300
João200
Maria400

Ou seja, como os nomes se repetem na tabela que estamos consultando, é muito viável e pertinente usarmos a cláusula GROUP BY.

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Entendi, mas no que tange ao tema da aula, o group by foi utilizada para oq? Já que lá usou-se AVG

Perfeito, compreendi melhor sua dúvida de maneira pontual!

A função AVG() foi usada para o cálculo da média dos preços, somente.

Já a cláusula GROUP BY foi usada para agrupar o resultado da consulta pelo campo de nome e preço! Porque, sem o uso da cláusula GROUP BY, o HAVING não poderia ser implementado. Visto que o HAVING só trabalha com valores agregados.

Então, só depois de agrupar/agregar os valores pelos campos de nome e preço, a consulta com HAVING irá funcionar normalmente.

Espero que tenha compreendido melhor, Pedro.

Fico à disposição!

E se usássemos o where no lugar funcionaria normal, correto?

Boa tarde, Pedro! Como vai?

Também é possível obter um resultado semelhante usando a cláusula WHERE.

Observe que, ao executar o código:

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

Temos como resultado:

Cardápio apresentando vários pratos com preços, incluindo Baguete de Presunto, Tofu Ovado e Caprese Wrap, em um fundo escuro.

E ao executar:

SELECT nome, preco 
FROM produtos 
WHERE preco > (SELECT AVG(preco) FROM produtos)

Temos como resultado os 13 pratos, da mesma maneira:

Cardápio apresentando vários pratos com preços, incluindo Baguete de Presunto, Tofu Ovado e Caprese Wrap, em um fundo escuro.

Repare que a ordenação ficou diferente, mas isso não implica na lógica da atividade.

Espero ter ajudado!

Entendi, então ela usou para mais para mostrar como usar o outro, correto?

solução!

Correto! Isso é uma forma até mesmo de te preparar melhor para o âmbito profissional, Pedro.

A maneira como desenvolvemos uma solução de código, por vezes, pode divergir da maneira que um colega de trabalho está acostumado.

Logo, conhecer essa multiplicidade de soluções nos torna um profissional diferenciado e preparado para lidar com situações diversas.

Fico feliz que esteja ganhando essa noção desde já!