Analise as seguintes tabelas de um banco de dados relacional:
Tabela FABRICANTE
Tabela EQUIPAMENTO
Considere a seguinte consulta SQL:
SELECT f.nome, SUM(e.preco) AS total FROM FABRICANTE f JOIN EQUIPAMENTO e ON f.id_fabricante = e.id_fabricante WHERE e.preco >= 70 GROUP BY f.nome HAVING SUM(e.preco) > 150;
Qual será o resultado produzido pela consulta?
AAlpha – 300 Beta – 120 Gamma – 300
BAlpha – 300 Gamma – 300
CAlpha – 200 Beta – 70 Gamma – 300
DGamma – 300
EAlpha – 300
Revelar gabarito e comentário▾
GabaritoB — Alpha – 300
Gamma – 300
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Consulta SQL com JOIN, GROUP BY e HAVING
Gabarito: letra B — a consulta retorna apenas os fabricantes cuja soma dos preços dos equipamentos (com preço >= 70) seja maior que 150, resultando em Alpha – 300 e Gamma – 300. A chave está na ordem de execução: o WHERE filtra as linhas antes da agregação, e o HAVING filtra os grupos depois da agregação.
A ideia por trás
A consulta combina duas tabelas, FABRICANTE e EQUIPAMENTO, através de um JOIN na coluna id_fabricante. O JOIN (junção interna) combina cada linha da tabela FABRICANTE com as linhas correspondentes da tabela EQUIPAMENTO que possuem o mesmo id_fabricante. O resultado é uma tabela virtual com todas as colunas das duas tabelas, onde cada linha representa um equipamento e o seu respectivo fabricante.
Em seguida, o WHERE e.preco >= 70 filtra as linhas, mantendo apenas os equipamentos com preço maior ou igual a 70. É importante notar que esse filtro é aplicado antes da agregação, ou seja, ele remove linhas individuais da tabela virtual, e não grupos inteiros.
Depois, o GROUP BY f.nome agrupa as linhas restantes pelo nome do fabricante. Para cada grupo, a função de agregação SUM(e.preco) calcula a soma dos preços dos equipamentos daquele fabricante que passaram pelo filtro do WHERE.
Por fim, o HAVING SUM(e.preco) > 150 filtra os grupos, mantendo apenas aqueles cuja soma dos preços seja maior que 150. O HAVING é aplicado depois da agregação, ou seja, ele filtra os grupos formados pelo GROUP BY.
A pegadinha da banca
A banca explora a confusão entre WHERE e HAVING. O WHERE filtra linhas individuais antes da agregação, enquanto o HAVING filtra grupos depois da agregação. Se o filtro e.preco >= 70 fosse aplicado no HAVING, o resultado seria diferente, pois ele filtraria os grupos pela soma dos preços, e não os equipamentos individuais.
Aplicando ao caso concreto
Vamos supor que as tabelas tenham os seguintes dados:
Tabela FABRICANTE:
id_fabricante
nome
1
Alpha
2
Beta
3
Gamma
Tabela EQUIPAMENTO:
id_equipamento
id_fabricante
preco
1
1
100
2
1
200
3
2
70
4
2
50
5
3
150
6
3
150
Aplicando o JOIN, obtemos:
f.nome
e.preco
Alpha
100
Alpha
200
Beta
70
Beta
50
Gamma
150
Gamma
150
Aplicando o WHERE e.preco >= 70, removemos a linha Beta – 50:
f.nome
e.preco
Alpha
100
Alpha
200
Beta
70
Gamma
150
Gamma
150
Aplicando o GROUP BY f.nome e o SUM(e.preco):
f.nome
SUM(e.preco)
Alpha
300
Beta
70
Gamma
300
Aplicando o HAVING SUM(e.preco) > 150, removemos o grupo Beta – 70:
f.nome
SUM(e.preco)
Alpha
300
Gamma
300
Portanto, o resultado é Alpha – 300 e Gamma – 300, que corresponde à letra B.
Alternativa A — ❌ Incorreta
Inclui Beta – 120, mas o WHERE e.preco >= 70 filtra o equipamento de preço 50, e a soma para Beta fica em 70, não 120. Além disso, o HAVING SUM(e.preco) > 150 exclui o grupo Beta, pois 70 não é maior que 150.
Alternativa B — ✅ Correta ⟵ GABARITO
A consulta retorna apenas os fabricantes cuja soma dos preços dos equipamentos (com preço >= 70) seja maior que 150. Alpha soma 300 (100 + 200) e Gamma soma 300 (150 + 150), ambos passam no HAVING. Beta soma 70 (apenas o equipamento de preço 70), que não passa no HAVING.
Alternativa C — ❌ Incorreta
Apresenta Beta – 70, mas o HAVING SUM(e.preco) > 150 exclui o grupo Beta, pois 70 não é maior que 150. Além disso, os valores de Alpha e Gamma estão corretos, mas a inclusão de Beta torna a alternativa incorreta.
Alternativa D — ❌ Incorreta
Omite o fabricante Alpha, que também atende aos critérios da consulta. Alpha soma 300, que é maior que 150, portanto deveria aparecer no resultado.
Alternativa E — ❌ Incorreta
Omite o fabricante Gamma, que também atende aos critérios da consulta. Gamma soma 300, que é maior que 150, portanto deveria aparecer no resultado.
NÃO CAIA NESSA!
A banca troca o papel do WHERE e do HAVING. O WHERE filtra linhas individuais antes da agregação, enquanto o HAVING filtra grupos depois da agregação. Se você aplicar o filtro e.preco >= 70 no HAVING, o resultado seria diferente, pois ele filtraria os grupos pela soma dos preços, e não os equipamentos individuais. Fique atento a essa distinção!
PEGA ESSA DICA!
Para resolver questões de SQL com GROUP BY e HAVING, siga a ordem de execução: 1) FROM e JOIN; 2) WHERE; 3) GROUP BY; 4) HAVING; 5) SELECT. Aplique cada etapa na ordem e você chegará ao resultado correto.