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
qa630708
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 uni_descricao, ser_descricao

from Unidade U

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

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

order by 1, 2

 

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

  1. AMostra os atributos uni_descricao e ser_descricao das entidades Unidade e UnidadeServico respectivamente, por meio da entidade associativa Servico.
  2. BMostra os atributos uni_descricao e ser_descricao das entidades Servico e UnidadeServico respectivamente, por meio da entidade associativa Unidade.
  3. CApresenta uni_descricao de Unidade, bem como ser_descricao de cada Servico associado, ordenado crescentemente por uni_descricao e ser_descricao.
  4. DApresenta uni_descricao de Unidade, bem como ser_descricao de cada Servico associado, ordenado crescentemente pelos dois primeiros atributos da entidade Unidade.
  5. EA expressão SQL apresenta erro de sintaxe.
Revelar gabarito e comentário

GabaritoC — Apresenta uni_descricao de Unidade, bem como ser_descricao de cada Servico associado, ordenado crescentemente por uni_descricao e ser_descricao.

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 com JOIN: interpretando o modelo ER

Gabarito: letra C. A consulta SELECT uni_descricao, ser_descricao FROM Unidade U INNER JOIN UnidadeServico US ON U.uni_id = US.uni_id INNER JOIN Servico S ON S.ser_id = US.ser_id ORDER BY 1, 2 retorna a descrição de cada Unidade e a descrição de cada Serviço associado a ela, ordenando o resultado crescentemente por uni_descricao e depois por ser_descricao. A alternativa C descreve exatamente esse comportamento, identificando corretamente a origem de cada coluna e o efeito da cláusula ORDER BY 1, 2.

A consulta SQL apresentada realiza uma junção entre três tabelas: Unidade, UnidadeServico e Servico. A tabela UnidadeServico atua como uma entidade associativa (ou tabela de ligação), que resolve o relacionamento muitos-para-muitos (N:N) entre Unidade e Servico. No modelo ER, quando duas entidades têm um relacionamento N:N, é comum criar uma tabela associativa que armazena as chaves estrangeiras das duas entidades originais, permitindo representar corretamente a associação no modelo relacional.

O INNER JOIN é o tipo de junção que retorna apenas os registros que possuem correspondência em ambas as tabelas envolvidas. No contexto da consulta, ele garante que apenas as unidades que possuem serviços associados (e os serviços que possuem unidades associadas) apareçam no resultado. A ordem das junções é importante: primeiro une-se Unidade com UnidadeServico pela chave uni_id, e depois o resultado é unido com Servico pela chave ser_id. Isso cria um caminho lógico que conecta cada unidade aos seus respectivos serviços.

A cláusula ORDER BY 1, 2 é um recurso do SQL que permite ordenar o resultado pelas colunas da lista de seleção, usando a posição ordinal. O número 1 refere-se à primeira coluna do SELECT (uni_descricao) e o número 2 refere-se à segunda coluna (ser_descricao). O padrão de ordenação é ascendente (crescente), a menos que se especifique DESC. Portanto, o resultado será ordenado primeiro pela descrição da unidade e, em caso de empate, pela descrição do serviço.

A pegadinha desta questão está na identificação da origem de cada coluna e no efeito da ordenação. As alternativas A e B confundem a origem dos atributos, atribuindo uni_descricao e ser_descricao a entidades erradas. A alternativa D erra ao afirmar que a ordenação é feita pelos "dois primeiros atributos da entidade Unidade", quando na verdade é feita pelas duas colunas do resultado. A alternativa E é incorreta porque a consulta é sintaticamente válida.

Guarde a distinção entre a origem dos atributos no SELECT e o efeito do ORDER BY: é exatamente nesses dois pontos que as alternativas se dividem.

Critério

Alternativa A

Alternativa B

Alternativa C (Gabarito)

Alternativa D

Alternativa E

Origem de uni_descricao

Unidade (correto)

Servico (errado)

Unidade (correto)

Unidade (correto)

— (erro de sintaxe)

Origem de ser_descricao

UnidadeServico (errado)

UnidadeServico (errado)

Servico (correto)

Servico (correto)

Papel da entidade associativa

Servico (errado)

Unidade (errado)

UnidadeServico (correto)

UnidadeServico (implícito)

Interpretação do ORDER BY 1, 2

Não menciona

Não menciona

Ordena pelas colunas do SELECT (correto)

Ordena pelos atributos da entidade Unidade (errado)

Veredito

❌ Incorreta

❌ Incorreta

✅ Correta

❌ Incorreta

❌ Incorreta

Alternativa A — ❌ Incorreta

Afirma que uni_descricao e ser_descricao vêm das entidades Unidade e UnidadeServico, respectivamente, "por meio da entidade associativa Servico". O erro está na origem do segundo atributo: ser_descricao é um atributo da entidade Servico, não de UnidadeServico. A tabela UnidadeServico é a entidade associativa que liga Unidade e Servico, mas ela não possui o atributo ser_descricao — ela apenas contém as chaves estrangeiras uni_id e ser_id. Além disso, a expressão "por meio da entidade associativa Servico" inverte o papel: a entidade associativa é UnidadeServico, não Servico.

Alternativa B — ❌ Incorreta

Afirma que uni_descricao e ser_descricao vêm das entidades Servico e UnidadeServico, respectivamente, "por meio da entidade associativa Unidade". O erro é duplo: primeiro, uni_descricao é atributo de Unidade, não de Servico; segundo, ser_descricao é atributo de Servico, não de UnidadeServico. A entidade associativa é UnidadeServico, não Unidade. A alternativa inverte completamente a origem dos atributos e o papel das entidades no relacionamento.

Alternativa C — ✅ Correta ⟵ GABARITO

Descreve corretamente o comportamento da consulta: apresenta uni_descricao de Unidade e ser_descricao de cada Servico associado, ordenado crescentemente por uni_descricao e ser_descricao. A origem dos atributos está correta (uni_descricao vem de Unidade, ser_descricao vem de Servico), o INNER JOIN garante que apenas os serviços associados a cada unidade apareçam, e o ORDER BY 1, 2 ordena o resultado pelas duas colunas selecionadas em ordem crescente.

Alternativa D — ❌ Incorreta

Erra ao afirmar que a ordenação é feita pelos "dois primeiros atributos da entidade Unidade". O ORDER BY 1, 2 ordena pelas duas colunas do resultado da consulta, que são uni_descricao e ser_descricao — não pelos dois primeiros atributos da entidade Unidade. A entidade Unidade pode ter outros atributos (como uni_id, por exemplo), mas a ordenação é feita exclusivamente pelas colunas selecionadas no SELECT, na ordem em que aparecem.

Alternativa E — ❌ Incorreta

Afirma que a expressão SQL apresenta erro de sintaxe. A consulta é sintaticamente válida: utiliza corretamente SELECT, FROM, INNER JOIN, ON e ORDER BY. A sintaxe do INNER JOIN está correta, com as condições de junção especificadas adequadamente (ON U.uni_id = US.uni_id e ON S.ser_id = US.ser_id). O ORDER BY 1, 2 também é uma forma válida de ordenação por posição ordinal das colunas.

NÃO CAIA NESSA!

A banca troca a origem dos atributos e o papel da entidade associativa. Nas alternativas A e B, uni_descricao e ser_descricao são atribuídos a entidades erradas, e a entidade associativa é nomeada incorretamente. Na alternativa D, o ORDER BY 1, 2 é interpretado como ordenação pelos atributos da entidade Unidade, quando na verdade ordena pelas colunas do resultado. Identifique sempre de qual tabela cada coluna vem e o que a cláusula ORDER BY realmente ordena.

PEGA ESSA DICA!

Para resolver questões de SQL com JOIN, siga este roteiro: (1) identifique as tabelas envolvidas e o tipo de junção; (2) verifique as condições ON para entender como as tabelas se conectam; (3) analise a lista de colunas do SELECT e identifique a origem de cada uma; (4) interprete o ORDER BY — se usar números, eles se referem à posição das colunas no SELECT, não aos atributos das tabelas. Com esse método, você evita os erros clássicos de atribuição incorreta de colunas e interpretação errada da ordenação.

Gabarito: letra C

Link permanente: /questoes/qa630708