Questão de Banco de Dados — Geral — Quadrix 2026
- Código
- qa433559
- Banca
- Quadrix
- Órgão
- CREFITO 17
- Ano
- 2026
- Cargo
- Ana ( )
- CCerto
- EErrado
GabaritoE — Errado
Gabarito: ERRADO. A cláusula HAVING atua depois do GROUP BY, filtrando grupos já agregados, enquanto o WHERE atua antes do GROUP BY, filtrando linhas individuais. A afirmação inverte completamente essa ordem e o objeto de cada filtro — é exatamente essa inversão que a banca explora.
A ordem lógica de execução de uma consulta SQL é uma das pegadinhas mais clássicas de banco de dados. O banco não executa as cláusulas na ordem em que aparecem escritas no comando; ele segue uma sequência fixa, que determina o que cada cláusula "enxerga". Essa sequência é:
FROM — define as tabelas de origem e os joins;
WHERE — filtra linhas individuais (antes de qualquer agregação);
GROUP BY — agrupa as linhas sobreviventes em grupos;
HAVING — filtra grupos (depois da agregação);
SELECT — projeta as colunas e calcula as expressões;
ORDER BY — ordena o resultado final.
O ponto central é a distinção entre filtro de linha (WHERE) e filtro de grupo (HAVING). O WHERE decide, linha a linha, quais registros entram no agrupamento — ele não enxerga totais, contagens ou somas. O HAVING, por sua vez, só existe depois que os grupos foram formados e as funções de agregação (COUNT, SUM, AVG etc.) foram calculadas; ele decide quais grupos aparecem no resultado final.
No script da questão, o WHERE p.especialidade = 'Fisioterapia' elimina, antes do agrupamento, todos os profissionais que não são fisioterapeutas. Só depois disso o GROUP BY p.nome, c.cidade forma os grupos, e o HAVING COUNT(a.id) > 10 descarta os grupos com 10 ou menos atendimentos. Se a ordem fosse invertida — como a afirmação sugere — o HAVING tentaria filtrar linhas que ainda não foram agregadas, o que é semanticamente impossível: não existe COUNT(a.id) para uma linha individual.
Um exemplo concreto ajuda a fixar. Imagine que um fisioterapeuta tenha 12 atendimentos, mas 3 deles sejam de outra especialidade (por erro de cadastro). Com o WHERE aplicado primeiro, esses 3 são descartados, sobram 9, e o HAVING COUNT > 10 elimina o grupo. Se o HAVING viesse antes (como a afirmação diz), ele não teria como contar — e o resultado seria outro. A ordem não é detalhe de implementação: ela muda o resultado da consulta.
A pegadinha da banca é dupla: (1) inverter a posição de WHERE e HAVING na ordem lógica e (2) trocar o objeto de cada um — dizer que o HAVING filtra "linhas individuais" quando ele filtra grupos. Guarde a fronteira: WHERE = linha, antes do GROUP BY; HAVING = grupo, depois do GROUP BY. É exatamente nessa fronteira que a afirmação erra.
A afirmação está errada por dois motivos: inverte a ordem (diz que HAVING vem antes de WHERE) e troca o objeto (diz que HAVING filtra linhas individuais). Na ordem lógica real, o WHERE vem antes do GROUP BY e filtra linhas; o HAVING vem depois do GROUP BY e filtra grupos. No script, o WHERE p.especialidade = 'Fisioterapia' é aplicado primeiro, e o HAVING COUNT(a.id) > 10 só atua sobre os grupos já formados.
Para não errar na prova, decore a sequência FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY e associe cada filtro ao seu objeto: WHERE "linha", HAVING "grupo". Quando a questão falar em "filtrar linhas individuais", o filtro é WHERE; quando falar em "filtrar grupos após agregação", é HAVING. Essa associação resolve a maioria das pegadinhas sobre o tema.
Gabarito: ERRADO.
Link permanente: /questoes/qa433559