Pular para o conteúdo principal

Questão de Banco de Dados — Geral — Quadrix 2026

Banco de DadosGeral
Código
qa433559
Banca
Quadrix
Órgão
CREFITO 17
Ano
2026
Cargo
Ana ( )
Durante uma análise das rotinas do sistema, o analista deparou‑se com o script SQL a seguir, utilizado diariamente para gerar relatórios financeiros de fisioterapeutas cadastrados. SELECT p.nome, c.cidade, COUNT(a.id) AS total_atendimentos, SUM(a.valor) AS receita_total FROM Profissional p INNER JOIN Atendimento a ON p.id = a.id_profissional LEFT JOIN Clinica c ON a.id_clinica = c.id WHERE p.especialidade = ‘Fisioterapia’ GROUP BY p.nome, c.cidade HAVING COUNT(a.id) > 10 ORDER BY receita_total DESC; Com base nessa situação hipotética e a partir da análise estrutural dessa query e dos conceitos fundamentais de banco de dados, julgue o item seguinte. Na ordem lógica de processamento da consulta, a cláusula HAVING atua antes de WHERE, filtrando linhas individuais que só depois serão submetidas ao GROUP BY.
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoE — Errado

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”.

Ordem lógica de processamento de uma consulta SQL

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 é:

  1. FROM — define as tabelas de origem e os joins;

  2. WHERE — filtra linhas individuais (antes de qualquer agregação);

  3. GROUP BY — agrupa as linhas sobreviventes em grupos;

  4. HAVING — filtra grupos (depois da agregação);

  5. SELECT — projeta as colunas e calcula as expressões;

  6. 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.

  1. 1FROM (tabelas e joins)
  2. 2WHERE (filtra linhas)
  3. 3GROUP BY (agrupa)
  4. 4HAVING (filtra grupos)
  5. 5SELECT (projeta)
  6. 6ORDER BY (ordena)
LEVEL · soulevel.com.br

Item — ❌ ERRADO

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.

NÃO CAIA NESSA!

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