Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2023

Banco de DadosSQL
Código
qq893503
Banca
FUNDATEC
Órgão
IF Farroupilha - RS
Ano
2023
Nível
Médio
Cargo
Técnico de Tecnologia da Informação

Para responder à questão, considere a Figura 2 abaixo:



Imagem da questão

Figura 2 – Tabelas “Cargo” e “Funcionário” 

Considerando as tabelas apresentadas na Figura 2, assinale a alternativa que apresenta um comando SQL que retornará o nome de cada funcionário e o respectivo nome de seu superior.
  1. ASELECT F.NOME, F2.NOMEFROM FUNCIONARIO F, FUNCIONARIO F2WHERE F.ID_FUNCIONARIO_SUPERIOR = F2.ID
  2. BSELECT NOME, F2.NOMEFROM FUNCIONARIO, FUNCIONARIO F2WHERE ID = F2.ID_FUNCIONARIO_SUPERIOR
  3. CSELECT FUNC.NOME, SUP.NOMEFROM FUNCIONARIO FUNC, FUNCIONARIO SUPWHERE FUNC.ID = SUP.ID
  4. DSELECT F1.NOME, F2.NOMEFROM FUNCIONARIO F1, F2WHERE F.ID_FUNCIONARIO_SUPERIOR IS F2.ID
  5. ESELECT NOME NOME_FUNC, NOME NOME_SUPFROM FUNCIONARIOWHERE ID = ID_FUNCIONARIO_SUPERIOR
Revelar gabarito e comentário

GabaritoA — SELECT F.NOME, F2.NOME FROM FUNCIONARIO F, FUNCIONARIO F2 WHERE F.ID_FUNCIONARIO_SUPERIOR = F2.ID

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

Auto-junção (Self Join) em SQL

Gabarito: letra A. A consulta correta usa uma auto-junção (self join), que é a técnica de unir uma tabela a ela mesma para relacionar registros que referenciam outros registros da mesma tabela — exatamente o caso de um funcionário que aponta para seu superior. A alternativa A faz isso corretamente ao criar dois aliases (F e F2) para a tabela FUNCIONARIO e unir as linhas pela condição F.ID_FUNCIONARIO_SUPERIOR = F2.ID, retornando o nome do funcionário (F.NOME) e o nome do superior (F2.NOME).

A auto-junção é um recurso essencial quando uma tabela possui uma chave estrangeira que referencia a própria chave primária. No modelo relacional, isso representa um relacionamento recursivo, como "funcionário tem um superior que também é funcionário". Para executar essa consulta, é obrigatório usar aliases (apelidos) para a tabela, pois o SQL precisa distinguir as duas "cópias" da mesma tabela na consulta — uma representando o funcionário e outra representando o superior.

A sintaxe da auto-junção segue o mesmo padrão de uma junção comum, mas com a tabela aparecendo duas vezes na cláusula FROM, cada uma com um alias diferente. A condição de junção no WHERE (ou no ON, se usar JOIN explícito) deve comparar a chave estrangeira de uma cópia com a chave primária da outra. No caso da questão, F.ID_FUNCIONARIO_SUPERIOR é a chave estrangeira que aponta para o ID do superior, e F2.ID é a chave primária da tabela "duplicada".

Vamos entender por que isso funciona com um exemplo: se o funcionário "João" tem ID = 1 e ID_FUNCIONARIO_SUPERIOR = 2, e o funcionário "Maria" tem ID = 2, a junção F.ID_FUNCIONARIO_SUPERIOR = F2.ID vai casar a linha de João (como F) com a linha de Maria (como F2), retornando F.NOME = 'João' e F2.NOME = 'Maria'. Assim, o resultado mostra cada funcionário com o nome do seu superior.

A pegadinha desta questão está em inverter a condição de junção ou usar aliases de forma incorreta. A banca testa se o candidato entende que a chave estrangeira (ID_FUNCIONARIO_SUPERIOR) deve ser comparada com a chave primária (ID) da outra cópia da tabela. Além disso, é preciso que os aliases sejam usados de forma consistente na cláusula SELECT e no WHERE. Guarde o padrão: a coluna que referencia (FK) de um alias deve ser igual à coluna referenciada (PK) do outro alias.

Critério

Alternativa A (✅ Gabarito)

Alternativa B

Alternativa C

Alternativa D

Alternativa E

Aliases das duas cópias da tabela

F e F2 (ambos definidos)

Primeira tabela sem alias; apenas F2 definido

FUNC e SUP (ambos definidos)

F1 definido, mas F2 sem tabela associada

Nenhum alias (tabela única)

Condição de junção (FK = PK)

F.ID_FUNCIONARIO_SUPERIOR = F2.ID (correta)

ID = F2.ID_FUNCIONARIO_SUPERIOR (invertida)

FUNC.ID = SUP.ID (compara PK com PK)

F.ID_FUNCIONARIO_SUPERIOR IS F2.ID (operador IS inválido)

ID = ID_FUNCIONARIO_SUPERIOR (sem junção, mesma linha)

Sintaxe do FROM

Válida (FUNCIONARIO F, FUNCIONARIO F2)

Válida, mas sem alias na 1ª tabela

Válida

Inválida (FROM FUNCIONARIO F1, F2)

Válida (tabela única)

Retorna nome do funcionário e do superior

Sim (F.NOME e F2.NOME)

Não (condição invertida)

Não (retorna o mesmo nome duas vezes)

Não (erro de sintaxe e operador)

Não (sem junção)

Alternativa A — ✅ Correta ⟵ GABARITO

Esta é a única alternativa que implementa corretamente a auto-junção. Ela cria dois aliases (F e F2) para a tabela FUNCIONARIO e usa a condição F.ID_FUNCIONARIO_SUPERIOR = F2.ID. Isso significa que, para cada funcionário (representado por F), o SQL procura na mesma tabela (representada por F2) o registro cujo ID é igual ao ID_FUNCIONARIO_SUPERIOR de F. O SELECT retorna F.NOME (nome do funcionário) e F2.NOME (nome do superior), exatamente o que o enunciado pede.

Alternativa B — ❌ Incorreta

O erro está na condição do WHERE: ID = F2.ID_FUNCIONARIO_SUPERIOR. Aqui, a coluna ID (sem alias) é comparada com F2.ID_FUNCIONARIO_SUPERIOR. O problema é que ID sem alias se refere à primeira tabela do FROM (que é FUNCIONARIO, sem alias), mas a comparação está invertida: deveria ser FUNCIONARIO.ID_FUNCIONARIO_SUPERIOR = F2.ID. Além disso, a primeira tabela não tem alias, o que torna a referência ID ambígua e a condição logicamente incorreta — ela compararia o ID do funcionário com o ID_FUNCIONARIO_SUPERIOR do superior, o que não retorna o relacionamento correto.

Alternativa C — ❌ Incorreta

A condição WHERE FUNC.ID = SUP.ID compara as chaves primárias das duas cópias da tabela. Isso faria com que cada funcionário fosse relacionado apenas a ele mesmo (quando ID é igual), retornando o nome do funcionário duas vezes, em vez de relacionar o funcionário ao seu superior. Para a auto-junção funcionar, a comparação deve ser entre a chave estrangeira de uma cópia e a chave primária da outra, não entre duas chaves primárias.

Alternativa D — ❌ Incorreta

Esta alternativa tem dois erros graves. Primeiro, a sintaxe FROM FUNCIONARIO F1, F2 é inválida: o alias F2 não está associado a nenhuma tabela. O correto seria FROM FUNCIONARIO F1, FUNCIONARIO F2. Segundo, a condição WHERE F.ID_FUNCIONARIO_SUPERIOR IS F2.ID usa o operador IS para comparação de igualdade, o que é incorreto — o operador IS é usado apenas para comparar com NULL (ex.: coluna IS NULL). Para igualdade, deve-se usar =.

Alternativa E — ❌ Incorreta

Esta alternativa não faz nenhuma junção. Ela seleciona a coluna NOME duas vezes (com aliases NOME_FUNC e NOME_SUP) da mesma tabela FUNCIONARIO, sem criar uma segunda cópia da tabela. A condição WHERE ID = ID_FUNCIONARIO_SUPERIOR compara a chave primária com a chave estrangeira na mesma linha, o que só retornaria funcionários cujo ID é igual ao seu próprio ID_FUNCIONARIO_SUPERIOR (um auto-relacionamento direto, que não é o caso geral). Para retornar o nome do superior, seria necessário usar uma auto-junção com aliases.

Gabarito: letra A

Link permanente: /questoes/qq893503