Pular para o conteúdo principal

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

Banco de DadosSQL
Código
qg599039
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 corretamente os veterinários que possuem mais atendimentos em clínicas de Brasília do que em Goiânia.SELECT v.nomeFROM VETERINARIO vINNER JOIN ATENDIMENTO a ON v.id_vet = a.id_vetINNER JOIN CLINICA c ON a.id_clinica = c.id_clinicaWHERE c.cidade = 'Brasília'GROUP BY v.id_vetHAVING COUNT(a.id_atendimento) > (SELECT COUNT(a2.id_atendimento)FROM ATENDIMENTO a2INNER JOIN CLINICA c2 ON a2.id_clinica = c2.id_clinicaWHERE c2.cidade = 'Goiânia' );
  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”.
SE LIGUE NESSA!

Esta questão depende de um texto-base (tabelas do banco CRMV_GO) que não está disponível aqui. O raciocínio abaixo é o método de análise do comando SQL — confira os dados e a estrutura das tabelas no enunciado original.

Comando SELECT com GROUP BY e subconsulta: análise da consulta SQL

Gabarito: ERRADO (letra E). O comando SQL apresentado contém um erro de sintaxe: a string literal 'Goiânia está com a aspa simples de fechamento ausente, o que torna a consulta inválida. Além disso, mesmo que a sintaxe fosse corrigida, a consulta não retornaria corretamente os veterinários com mais atendimentos em Brasília do que em Goiânia, pois a subconsulta correlacionada não está vinculada ao veterinário do grupo externo — ela calcula o total de atendimentos em Goiânia de todos os veterinários, e não de cada veterinário individualmente.

O comando SELECT é a instrução fundamental da linguagem SQL para recuperar dados de um banco de dados. Ele combina cláusulas que definem quais colunas retornar (SELECT), de quais tabelas (FROM), como juntar essas tabelas (JOIN), quais linhas filtrar antes do agrupamento (WHERE), como agrupar os resultados (GROUP BY) e quais grupos exibir após a agregação (HAVING). A ordem lógica de execução é: FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Isso significa que o WHERE filtra linhas individuais antes do agrupamento, enquanto o HAVING filtra grupos já formados, podendo usar funções de agregação como COUNT, SUM, AVG, MAX e MIN.

No caso da consulta em análise, o objetivo declarado é listar os veterinários que possuem mais atendimentos em clínicas de Brasília do que em Goiânia. A estrutura tenta fazer isso contando os atendimentos em Brasília (agrupados por veterinário) e comparando esse total com uma subconsulta que conta os atendimentos em Goiânia. Há dois problemas graves nessa abordagem.

Primeiro, o erro de sintaxe: a subconsulta termina com WHERE c2.cidade = 'Goiânia\n' ; — a aspa simples que abre a string 'Goiânia não é fechada, o que quebra a consulta. Em SQL, toda string literal deve estar entre aspas simples pareadas; uma aspa aberta sem fechamento gera erro de execução. Esse erro sozinho já torna o comando incorreto.

Segundo, mesmo corrigindo a sintaxe, a lógica está errada. A subconsulta SELECT COUNT(a2.id_atendimento) FROM ATENDIMENTO a2 INNER JOIN CLINICA c2 ON a2.id_clinica = c2.id_clinica WHERE c2.cidade = 'Goiânia' calcula o total de atendimentos em Goiânia de todos os veterinários, sem qualquer correlação com o veterinário do grupo externo. Para comparar por veterinário, a subconsulta deveria ser correlacionada, referenciando o veterinário do grupo externo, por exemplo: WHERE c2.cidade = 'Goiânia' AND a2.id_vet = v.id_vet. Sem essa correlação, o HAVING compara o total de atendimentos de cada veterinário em Brasília com o total geral de atendimentos em Goiânia de todos os veterinários — o que não atende ao que se pede.

Além disso, há uma questão de agrupamento: a consulta externa usa GROUP BY v.id_vet e seleciona v.nome. Em SQL padrão, toda coluna no SELECT que não esteja em uma função de agregação deve aparecer no GROUP BY. Como v.nome é funcionalmente dependente de v.id_vet (assumindo que id_vet é a chave primária), a consulta é válida em muitos SGBDs, mas é uma prática que pode gerar erro em outros. O correto seria GROUP BY v.id_vet, v.nome para garantir conformidade com o padrão SQL.

A pegadinha da banca aqui é dupla: primeiro, o erro de sintaxe na string literal, que é um descuido fácil de passar despercebido; segundo, a lógica incorreta da subconsulta não correlacionada, que parece fazer sentido à primeira vista, mas não compara os atendimentos por veterinário. O candidato que apenas lê a consulta rapidamente pode achar que ela está correta, sem perceber que a subconsulta não está vinculada ao veterinário do grupo externo.

Para resolver corretamente essa consulta, seria necessário correlacionar a subconsulta com o veterinário externo, como em:

SELECT v.nome
FROM VETERINARIO v
INNER JOIN ATENDIMENTO a ON v.id_vet = a.id_vet
INNER JOIN CLINICA c ON a.id_clinica = c.id_clinica
WHERE c.cidade = 'Brasília'
GROUP BY v.id_vet, v.nome
HAVING COUNT(a.id_atendimento) > (
    SELECT COUNT(a2.id_atendimento)
    FROM ATENDIMENTO a2
    INNER JOIN CLINICA c2 ON a2.id_clinica = c2.id_clinica
    WHERE c2.cidade = 'Goiânia' AND a2.id_vet = v.id_vet
);

Nessa versão corrigida, a subconsulta é correlacionada: para cada veterinário do grupo externo, ela conta os atendimentos em Goiânia daquele veterinário específico, permitindo a comparação correta.

Item — ❌ ERRADO

O comando apresentado está incorreto por dois motivos principais: (1) erro de sintaxe — a string 'Goiânia não tem a aspa de fechamento, tornando a consulta inválida; (2) erro de lógica — a subconsulta não é correlacionada, calculando o total de atendimentos em Goiânia de todos os veterinários, e não de cada veterinário individualmente, o que impede a comparação correta. Mesmo que a sintaxe fosse corrigida, a consulta não retornaria o resultado esperado.

Gabarito: ERRADO (letra E).

Link permanente: /questoes/qg599039