Pular para o conteúdo principal

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

Banco de DadosSQL
Código
qg599041
Banca
Quadrix
Órgão
CRMV-GO
Ano
2025
Nível
Superior
Cargo
Analista Administrativo
O Conselho Regional de Medicina Veterinária do Estado de Goiás (CRMV‑GO) mantinha um banco de dados relacional denominado CRMV_GO, que registrava veterinários, especialidades, clínicas e atendimentos. As principais tabelas estão dispostas a seguir.

VETERINARIO (id_vet, nome, crmv, data_inscricao, id_especialidade, ativo)
ESPECIALIDADE (id_especialidade, descricao)
CLINICA (id_clinica, nome_clinica, cidade)
ATENDIMENTO (id_atendimento, id_vet, id_clinica, data_atendimento, status)
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 realizaram atendimentos em todas as cidades cadastradas na tabela CLINICA.SELECT nomeFROM VETERINARIO vWHERE id_vet IN (SELECT id_vetFROM ATENDIMENTO aINNER JOIN CLINICA c ON a.id_clinica = c.id_clinica);
  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”.

SQL: subconsulta e a semântica de "todas as cidades"

Gabarito: ERRADO (letra E). O comando apresentado não retorna os veterinários que realizaram atendimentos em todas as cidades cadastradas na tabela CLINICA, pois a subconsulta apenas verifica se o veterinário realizou pelo menos um atendimento em qualquer cidade, sem qualquer agrupamento ou comparação com o total de cidades. Para responder corretamente à pergunta, seria necessário usar uma consulta com GROUP BY e HAVING COUNT(DISTINCT ...) = (SELECT COUNT(*) FROM CLINICA).

O cerne da questão está na diferença entre os quantificadores lógicos "existe" (∃) e "para todo" (∀). A consulta com IN implementa o quantificador existencial: ela retorna os veterinários para os quais existe um atendimento em alguma cidade. Já a expressão "em todas as cidades" exige o quantificador universal: o veterinário deve ter atendido em cada uma das cidades cadastradas. Essa distinção é fundamental em SQL e é exatamente o que a banca explora.

Vamos decompor a consulta do enunciado:

SELECT nome
FROM VETERINARIO v
WHERE id_vet IN (
    SELECT id_vet
    FROM ATENDIMENTO a
    INNER JOIN CLINICA c ON a.id_clinica = c.id_clinica
);

A subconsulta faz um INNER JOIN entre ATENDIMENTO e CLINICA, retornando os id_vet que possuem ao menos um atendimento em qualquer clínica (e, portanto, em qualquer cidade). O IN no WHERE externo simplesmente filtra os veterinários cujo id_vet aparece nessa lista. Ou seja, o resultado são todos os veterinários que já realizaram pelo menos um atendimento, independentemente de quantas cidades diferentes foram atendidas.

Para ilustrar, imagine que existam três cidades cadastradas: Goiânia, Anápolis e Aparecida de Goiânia. Um veterinário que atendeu apenas em Goiânia seria incluído no resultado, mesmo não tendo atendido em Anápolis nem em Aparecida. Isso contraria diretamente a exigência de "todas as cidades".

A solução correta exigiria uma abordagem diferente. Uma forma clássica é contar quantas cidades distintas o veterinário atendeu e comparar com o total de cidades cadastradas:

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
GROUP BY v.id_vet, v.nome
HAVING COUNT(DISTINCT c.cidade) = (SELECT COUNT(*) FROM CLINICA);

Nessa versão, agrupamos por veterinário, contamos as cidades distintas em que ele atendeu e comparamos com o total de cidades. Somente os veterinários cuja contagem for igual ao total serão retornados. Alternativamente, poder-se-ia usar uma dupla negação com NOT EXISTS, mas a abordagem com GROUP BY e HAVING é a mais direta e didática.

A pegadinha da banca é justamente a inversão do quantificador: o candidato que lê rapidamente pode achar que a consulta está correta, pois ela usa IN e um JOIN, mas não percebe que falta a condição de "todos". A banca explora a confusão entre "existe pelo menos um" e "todos".

NÃO CAIA NESSA!

A banca troca o quantificador universal ("todas as cidades") pelo existencial ("pelo menos uma cidade"). O comando com IN e JOIN parece plausível, mas não faz nenhuma comparação com o total de cidades. Para resolver, lembre-se: "todos" em SQL quase sempre exige GROUP BY + HAVING com COUNT(DISTINCT ...) comparado ao total, ou uma dupla negação com NOT EXISTS.

  1. 1IN + JOIN = existe (∃)
  2. 2Retorna ≥1 atendimento
  3. 3Falta comparar com total
  4. 4Todas (∀) exige GROUP BY
  5. 5HAVING COUNT = total
LEVEL · soulevel.com.br

Alternativa C — ❌ Incorreta

A alternativa afirma que o comando apresenta corretamente os veterinários que realizaram atendimentos em todas as cidades. Isso é falso, pois a consulta retorna veterinários que realizaram pelo menos um atendimento em qualquer cidade, sem verificar se atenderam em todas. O erro está na ausência de uma condição que compare o número de cidades distintas atendidas com o total de cidades cadastradas.

Alternativa E — ✅ Correta ⟵ GABARITO

A alternativa está correta ao afirmar que o comando está errado. A justificativa é exatamente a explicada: a subconsulta com IN e INNER JOIN implementa o quantificador existencial, não o universal. Para atender ao requisito "todas as cidades", seria necessário usar GROUP BY com HAVING COUNT(DISTINCT c.cidade) = (SELECT COUNT(*) FROM CLINICA) ou uma abordagem equivalente com NOT EXISTS.

Gabarito: letra E

Link permanente: /questoes/qg599041