Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2025

Banco de DadosConsultas e Comandos em SQL
Código
qa699135
Banca
Quadrix
Órgão
CRMV GO
Ano
2025
Cargo
Ana Adm ( )
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 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 total FROM VETERINARIO v INNER JOIN ESPECIALIDADE e ON v.id_especialidade = e.id_especialidade INNER JOIN ATENDIMENTO a ON v.id_vet = a.id_vet WHERE a.status = 'Concluído' GROUP BY v.id_vet, v.nome, e.descricao HAVING 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”.

Consultas SQL: agrupamento, filtro e junções

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.

  1. 1FROM + 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 — ✅ CERTO

O comando está correto. Ele realiza as seguintes operações:

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

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

  3. WHERE a.status = 'Concluído': filtra apenas os atendimentos com status 'Concluído'.

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

  5. HAVING COUNT(a.id_atendimento) >= 5: filtra os grupos que tenham pelo menos cinco atendimentos concluídos.

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