Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2025
- Código
- qa699135
- Banca
- Quadrix
- Órgão
- CRMV GO
- Ano
- 2025
- Cargo
- Ana Adm ( )
- CCerto
- EErrado
GabaritoC — Certo
Gabarito: CERTO (letra C). O comando apresentado está sintaticamente correto e semanticamente adequado ao que o enunciado pede: ele junta as tabelas VETERINARIO, ESPECIALIDADE e ATENDIMENTO, filtra apenas os atendimentos com status 'Concluído', agrupa por veterinário e especialidade, e usa a cláusula HAVING para manter apenas os grupos com pelo menos cinco atendimentos concluídos. A lógica de usar WHERE para filtrar linhas antes da agregação e HAVING para filtrar grupos após a agregação está correta.
O comando SELECT é a base da linguagem de consulta de dados (DQL) em SQL. Ele permite recuperar dados de uma ou mais tabelas, combinando-as por meio de junções (JOIN), filtrando linhas com WHERE, agrupando resultados com GROUP BY e filtrando grupos com HAVING. A ordem lógica de execução de uma consulta SQL é: FROM (define as tabelas e junções), WHERE (filtra linhas individuais), GROUP BY (agrupa as linhas), HAVING (filtra grupos), SELECT (projeta as colunas) e ORDER BY (ordena o resultado).
Nesta questão, o objetivo é listar o nome do veterinário, a descrição da especialidade e o total de atendimentos concluídos, mas apenas para veterinários que tenham pelo menos cinco atendimentos concluídos. O comando usa INNER JOIN para combinar as tabelas, garantindo que apenas veterinários com especialidade e atendimentos correspondentes sejam incluídos. O WHERE filtra os atendimentos com status 'Concluído', o GROUP BY agrupa por veterinário e especialidade, e o HAVING filtra os grupos com contagem maior ou igual a cinco.
A distinção crucial entre WHERE e HAVING é o momento em que cada um atua: WHERE filtra linhas antes da agregação, enquanto HAVING filtra grupos após a agregação. Se o filtro de status fosse colocado no HAVING, o comando estaria incorreto, pois HAVING não pode referenciar colunas não agregadas diretamente. Da mesma forma, se o filtro de contagem fosse colocado no WHERE, ele não funcionaria, pois a função COUNT não pode ser usada no WHERE. O comando apresentado usa cada cláusula no lugar correto.
A pegadinha que a banca poderia explorar é a inversão dos papéis de WHERE e HAVING, ou o uso de LEFT JOIN em vez de INNER JOIN, o que alteraria o resultado. Neste caso, o comando está correto, pois usa INNER JOIN, WHERE para filtrar linhas e HAVING para filtrar grupos, exatamente como deveria.
O comando está correto. Ele realiza as seguintes operações:
FROM VETERINARIO v INNER JOIN ESPECIALIDADE e ON v.id_especialidade = e.id_especialidade: combina as tabelas VETERINARIO e ESPECIALIDADE, garantindo que apenas veterinários com especialidade cadastrada sejam incluídos.
INNER JOIN ATENDIMENTO a ON v.id_vet = a.id_vet: combina o resultado com a tabela ATENDIMENTO, incluindo apenas veterinários que possuem atendimentos.
WHERE a.status = 'Concluído': filtra apenas os atendimentos com status 'Concluído'.
GROUP BY v.id_vet, v.nome, e.descricao: agrupa os resultados por veterinário e especialidade. A inclusão de v.id_vet no GROUP BY é correta, pois garante que veterinários com o mesmo nome, mas IDs diferentes, sejam tratados como grupos distintos.
HAVING COUNT(a.id_atendimento) >= 5: filtra os grupos que tenham pelo menos cinco atendimentos concluídos.
SELECT v.nome, e.descricao, COUNT(a.id_atendimento) AS total: projeta o nome do veterinário, a especialidade e o total de atendimentos concluídos.
A ordem das cláusulas está correta e a lógica atende exatamente ao que o enunciado pede. Portanto, o item está CERTO.
Gabarito: CERTO (letra C).
Link permanente: /questoes/qa699135