Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024

Banco de DadosConsultas e Comandos em SQL
Código
qa630711
Banca
FUNDATEC
Órgão
CETENE
Ano
2024
Cargo
Tecno P ( )

Para responder a questão abaixo, considere o modelo entidade-relacionamento (ER) apresentado pela figura abaixo:

Imagem associada para resolução da questão

Figura 1 - Modelo entidade - realcionamento (ER)

 

Considerando o modelo ER apresentado pela Figura 1, analise a expressão SQL abaixo:

 

select unidade, servicos from (

select uni_descricao unidade, count(US.ser_id) servicos

from Unidade U

inner join UnidadeServico US on U.uni_id = US.uni_id

inner join Servico S on US.ser_id = S.ser_id

group by uni_descricao)

servicos

order by servicos desc

limit 3

 

Qual alternativa está correta ao executar essa expressão SQL?

  1. ALista os três primeiros registros de Unidade que possuem mais registros de Servico por meio da entidade associativa UnidadeServico.
  2. BApresenta os três primeiros registros de Unidade que possuem mais registros associados em UnidadeServico por meio da entidade associativa Servico.
  3. CLista os três primeiros registros de Unidade que possuem menos registros associados em Servico por meio da entidade associativa UnidadeServico.
  4. DApresenta os três primeiros registros de Unidade que possuem menos registros associados em UnidadeServico por meio da entidade associativa Servico.
  5. EA expressão SQL apresenta erro de sintaxe.
Revelar gabarito e comentário

GabaritoA — Lista os três primeiros registros de Unidade que possuem mais registros de Servico por meio da entidade associativa UnidadeServico.

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

Consulta SQL com Agregação e Ordenação

Gabarito: letra A. A consulta conta, para cada Unidade, quantos serviços estão associados a ela por meio da entidade associativa UnidadeServico, ordena o resultado em ordem decrescente pela contagem e limita a saída aos três primeiros registros — ou seja, lista as três Unidades com mais serviços associados. A alternativa A descreve exatamente esse comportamento.

A consulta SQL apresentada é um exemplo clássico de agregação com GROUP BY, ordenação com ORDER BY e limitação de resultados com LIMIT. Vamos decompor cada parte para entender o que ela faz:

  1. Subconsulta (derived table): A parte interna (select uni_descricao unidade, count(US.ser_id) servicos from Unidade U inner join UnidadeServico US on U.uni_id = US.uni_id inner join Servico S on US.ser_id = S.ser_id group by uni_descricao) cria uma tabela temporária com duas colunas: unidade (a descrição da unidade) e servicos (a contagem de serviços associados àquela unidade). O GROUP BY uni_descricao agrupa os registros por unidade, e o COUNT(US.ser_id) conta quantos registros de UnidadeServico existem para cada grupo — ou seja, quantos serviços estão vinculados àquela unidade.

  1. Junções (JOINs): A consulta faz INNER JOIN entre Unidade e UnidadeServico pela chave uni_id, e depois com Servico pela chave ser_id. Isso garante que apenas as unidades que possuem pelo menos um serviço associado sejam consideradas (o INNER JOIN exclui unidades sem associação). A entidade associativa UnidadeServico é o elo entre Unidade e Servico, representando um relacionamento muitos-para-muitos (N:N) entre essas entidades.

  1. Ordenação e limitação: A consulta externa select unidade, servicos from (...) servicos order by servicos desc limit 3 seleciona as duas colunas da subconsulta, ordena pela coluna servicos em ordem decrescente (desc) e limita o resultado a 3 linhas (limit 3). Portanto, o resultado final são as três unidades com o maior número de serviços associados.

A alternativa A é a única que descreve corretamente esse fluxo: "Lista os três primeiros registros de Unidade que possuem mais registros de Servico por meio da entidade associativa UnidadeServico." As demais alternativas contêm erros conceituais ou de direção (mais/menos) ou trocam os papéis das entidades.

Critério

Alternativa A (correta)

Alternativa B

Alternativa C

Alternativa D

Entidade associativa citada

UnidadeServico ✅

Servico ❌

UnidadeServico ✅

Servico ❌

Direção da ordenação

Mais (DESC) ✅

Mais (DESC) ✅

Menos ❌

Menos ❌

O que é contado

Serviços por unidade ✅

Registros em UnidadeServico (equivale, mas descrição imprecisa)

Serviços por unidade ✅

Registros em UnidadeServico ❌

Resultado final

3 unidades com mais serviços ✅

3 unidades com mais serviços (mas descrição errada da associação)

3 unidades com menos serviços ❌

3 unidades com menos serviços ❌

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa A está correta porque descreve exatamente o que a consulta faz: conta os serviços por unidade (via UnidadeServico), ordena do maior para o menor e limita a 3 resultados. O termo "mais registros de Servico" refere-se ao COUNT(US.ser_id), que conta quantos serviços estão associados a cada unidade. A expressão "por meio da entidade associativa UnidadeServico" está correta, pois é essa tabela que faz a ligação entre Unidade e Servico.

Alternativa B — ❌ Incorreta

A alternativa B diz que a consulta apresenta "os três primeiros registros de Unidade que possuem mais registros associados em UnidadeServico por meio da entidade associativa Servico". O erro está na última parte: "por meio da entidade associativa Servico". A entidade associativa é UnidadeServico, não Servico. Servico é uma entidade comum, não associativa. Além disso, a contagem é de serviços (COUNT(US.ser_id)), não de registros em UnidadeServico diretamente — embora, na prática, contar US.ser_id seja equivalente a contar registros de UnidadeServico (já que cada registro associa um serviço a uma unidade), a descrição "por meio da entidade associativa Servico" é tecnicamente incorreta.

Alternativa C — ❌ Incorreta

A alternativa C afirma que a consulta lista as unidades com "menos registros associados em Servico". O erro está na direção: a consulta usa order by servicos desc, ou seja, ordena em ordem decrescente, trazendo as unidades com mais serviços, não com menos. Além disso, a expressão "menos registros associados em Servico" é ambígua, mas o ponto central é a inversão da ordem.

Alternativa D — ❌ Incorreta

A alternativa D combina dois erros: diz que a consulta apresenta as unidades com "menos registros associados em UnidadeServico" (inversão da ordem, pois é desc) e novamente erra ao dizer "por meio da entidade associativa Servico" (o correto é UnidadeServico). Portanto, está duplamente incorreta.

Alternativa E — ❌ Incorreta

A alternativa E afirma que a expressão SQL apresenta erro de sintaxe. Isso é falso: a consulta é sintaticamente válida. A subconsulta tem GROUP BY, as junções estão corretas, e a consulta externa referencia a subconsulta com um alias (servicos). O ORDER BY e o LIMIT são cláusulas válidas. Não há erro de sintaxe.

NÃO CAIA NESSA!

A banca explora a confusão entre as entidades Servico e UnidadeServico. A entidade associativa é UnidadeServico, que representa o relacionamento N:N entre Unidade e Servico. As alternativas B e D trocam os papéis, dizendo que a associação é "por meio de Servico". Além disso, as alternativas C e D invertem a ordem (menos em vez de mais), testando se o candidato percebe o ORDER BY ... DESC. Fique atento a esses dois detalhes: quem é a entidade associativa e qual é a direção da ordenação.

PEGA ESSA DICA!

Para resolver questões de SQL que envolvem agregação, siga este roteiro: (1) identifique as tabelas e os JOINs; (2) veja o que está sendo contado (COUNT) e como o GROUP BY agrupa; (3) verifique a ordem (ASC/DESC) e o limite (LIMIT). Aqui, o COUNT(US.ser_id) conta serviços por unidade, e o ORDER BY servicos DESC traz os maiores primeiro. Se a alternativa falar em "menos", desconfie imediatamente.

Gabarito: letra A

Link permanente: /questoes/qa630711