Pular para o conteúdo principal

Questão de Banco de Dados — SQL — Quadrix 2025

Banco de DadosSQL
Código
qg599043
Banca
Quadrix
Órgão
CRMV-GO
Ano
2025
Nível
Superior
Cargo
Analista Administrativo
Com base nessa situação hipotética e no uso do comando SELECT no banco de dados CRMV_GO, julgue o item seguinte.O comando a seguir apresenta o nome do veterinário, a sua especialidade e o número total de atendimentos concluídos, incluindo apenas veterinários com pelo menos cinco atendimentos concluídos.SELECT v.nome, e.descricao, COUNT(a.id_atendimento) AS totalFROM VETERINARIO vINNER JOIN ESPECIALIDADE e ON v.id_especialidade = e.id_especialidadeINNER JOIN ATENDIMENTO a ON v.id_vet = a.id_vetWHERE a.status = 'Concluído'GROUP BY v.id_vet, v.nome, e.descricaoHAVING COUNT(a.id_atendimento) >= 5;
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

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

Comando SELECT com GROUP BY e HAVING: filtro antes e depois da agregação

SE LIGUE NESSA!

Esta questão depende de um texto-base com a estrutura e os dados das tabelas VETERINARIO, ESPECIALIDADE e ATENDIMENTO do banco CRMV_GO, que não está disponível aqui. O raciocínio abaixo ensina o método para julgar o comando SQL; confira os dados e a estrutura das tabelas no enunciado original.

Gabarito: CERTO (letra C). O comando apresentado está correto: ele usa INNER JOIN para combinar as três tabelas, filtra os atendimentos com status 'Concluído' na cláusula WHERE, agrupa por veterinário e especialidade, e aplica a condição de ter pelo menos cinco atendimentos concluídos na cláusula HAVING, que é o local correto para filtrar grupos após a agregação. A lógica do comando está alinhada com a semântica do SQL: WHERE filtra linhas individuais antes do agrupamento, e HAVING filtra grupos depois da agregação.

O comando SELECT é a instrução fundamental da linguagem SQL para recuperar dados de um banco de dados relacional. Ele permite combinar tabelas por meio de junções (JOIN), filtrar linhas com WHERE, agrupar registros com GROUP BY, e filtrar grupos com HAVING. A compreensão correta da ordem de execução lógica das cláusulas é essencial para escrever consultas corretas e para julgar comandos como o desta questão.

A ordem lógica de execução de um comando SELECT é: primeiro, as tabelas são combinadas (FROM e JOINs); segundo, as linhas individuais são filtradas pela cláusula WHERE; terceiro, as linhas resultantes são agrupadas conforme as colunas do GROUP BY; quarto, as funções de agregação (como COUNT, SUM, AVG) são calculadas para cada grupo; e, por fim, a cláusula HAVING filtra os grupos com base nos valores agregados. Essa distinção é crucial: WHERE não pode usar funções de agregação, pois é aplicada antes do agrupamento; HAVING é aplicada depois, e por isso pode referenciar colunas do GROUP BY e funções de agregação.

No comando em análise, a cláusula WHERE a.status = 'Concluído' filtra apenas os atendimentos concluídos, descartando os demais antes do agrupamento. Em seguida, o GROUP BY agrupa os registros por veterinário (id_vet e nome) e especialidade (descricao). A função COUNT(a.id_atendimento) conta quantos atendimentos concluídos cada veterinário possui em cada especialidade. Por fim, a cláusula HAVING COUNT(a.id_atendimento) >= 5 mantém apenas os grupos com pelo menos cinco atendimentos concluídos. Essa é exatamente a semântica pedida no enunciado: nome do veterinário, especialidade e total de atendimentos concluídos, incluindo apenas veterinários com pelo menos cinco atendimentos concluídos.

Um ponto que merece atenção é a inclusão de v.nome e e.descricao na cláusula GROUP BY. Em SQL, toda coluna não agregada que aparece na lista de seleção deve estar no GROUP BY (ou ser funcionalmente dependente de uma coluna do GROUP BY). Como v.nome é funcionalmente dependente de v.id_vet (chave primária da tabela VETERINARIO), e e.descricao é funcionalmente dependente de e.id_especialidade (chave primária da tabela ESPECIALIDADE), a consulta é válida mesmo que o GROUP BY inclua essas colunas. Na prática, incluí-las no GROUP BY é uma prática comum e segura para evitar erros em bancos que não implementam a detecção de dependência funcional.

A pegadinha que a banca poderia explorar neste tema é a troca entre WHERE e HAVING. Se a condição de ter pelo menos cinco atendimentos fosse colocada na cláusula WHERE, o comando estaria errado, pois WHERE não pode usar funções de agregação. No comando apresentado, a condição está corretamente na HAVING, o que torna o item certo. Outra pegadinha comum seria usar LEFT JOIN em vez de INNER JOIN, o que incluiria veterinários sem atendimentos, mas isso não ocorre aqui.

Guarde a fronteira entre WHERE e HAVING: WHERE filtra linhas antes do agrupamento; HAVING filtra grupos depois da agregação. É exatamente nessa distinção que o comando desta questão se apoia para estar correto.

Item — ✅ CERTO ⟵ GABARITO

O comando está correto. Ele segue a estrutura adequada para responder ao que o enunciado pede:

  • INNER JOIN entre VETERINARIO, ESPECIALIDADE e ATENDIMENTO combina as tabelas, mantendo apenas os registros que possuem correspondência em todas elas. Isso garante que apenas veterinários com atendimentos sejam considerados.

  • WHERE a.status = 'Concluído' filtra as linhas individuais, mantendo apenas os atendimentos concluídos antes do agrupamento.

  • GROUP BY v.id_vet, v.nome, e.descricao agrupa os registros por veterinário e especialidade, permitindo o cálculo da contagem por grupo.

  • COUNT(a.id_atendimento) conta o número de atendimentos concluídos de cada veterinário em cada especialidade.

  • HAVING COUNT(a.id_atendimento) >= 5 filtra os grupos, mantendo apenas aqueles com pelo menos cinco atendimentos concluídos.

A ordem das cláusulas está correta: WHERE antes do GROUP BY, e HAVING depois. A condição de ter pelo menos cinco atendimentos é uma condição sobre o grupo (após a agregação), portanto deve estar na HAVING, e está. O comando, portanto, apresenta exatamente o que o enunciado descreve: nome do veterinário, especialidade e total de atendimentos concluídos, incluindo apenas veterinários com pelo menos cinco atendimentos concluídos.

PEGA ESSA DICA!

Para julgar comandos SQL com GROUP BY e HAVING, verifique sempre: (1) se a condição que envolve função de agregação está na HAVING e não na WHERE; (2) se todas as colunas não agregadas do SELECT estão no GROUP BY; (3) se o tipo de JOIN (INNER, LEFT, RIGHT) é adequado ao que se deseja incluir ou excluir. Nesta questão, o comando atende a todos esses critérios.

Gabarito: letra C (CERTO).

Link permanente: /questoes/qg599043