Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
qa537589
Banca
FUNDATEC
Órgão
IFFAR
Ano
2023
Cargo
Tec ( )

Imagem associada para resolução 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.NOME FROM      FUNCIONARIO F, FUNCIONARIO F2      WHERE F.ID_FUNCIONARIO_SUPERIOR = F2.ID
  2. BSELECT NOME, F2.NOME      FROM FUNCIONARIO, FUNCIONARIO F2      WHERE ID = F2.ID_FUNCIONARIO_SUPERIOR
  3. CSELECT FUNC.NOME, SUP.NOME      FROM FUNCIONARIO FUNC, FUNCIONARIO SUP      WHERE FUNC.ID = SUP.ID
  4. DSELECT F1.NOME, F2.NOME      FROM FUNCIONARIO F1, F2      WHERE F.ID_FUNCIONARIO_SUPERIOR IS F2.ID
  5. ESELECT NOME NOME_FUNC, NOME NOME_SUP      FROM FUNCIONARIO      WHERE 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. O comando correto usa uma auto junção (self join) — a tabela FUNCIONARIO é unida a ela mesma por meio de dois aliases (F e F2), e a condição de junção relaciona a coluna ID_FUNCIONARIO_SUPERIOR de um funcionário com a coluna ID de outro, que é o seu superior. As demais alternativas erram na sintaxe, na lógica da junção ou na referência às colunas.

A auto junção é um recurso do SQL usado quando uma tabela precisa se relacionar com ela mesma. No caso de uma tabela de funcionários que possui uma coluna indicando o ID do superior (uma chave estrangeira que referencia a própria tabela), precisamos "duplicar" a tabela na consulta para comparar linhas diferentes. Isso é feito atribuindo aliases (apelidos) diferentes à mesma tabela na cláusula FROM, como se fossem duas tabelas distintas.

A lógica é simples: para cada funcionário (linha da tabela F), queremos encontrar o nome do seu superior. O superior também é um funcionário, então ele estará em outra linha da mesma tabela (representada pelo alias F2). A condição de junção F.ID_FUNCIONARIO_SUPERIOR = F2.ID estabelece exatamente esse vínculo: o valor da coluna que guarda o ID do superior na linha do funcionário deve ser igual ao valor da coluna ID na linha do superior.

Na prática, imagine que a tabela FUNCIONARIO tenha os seguintes dados:

ID

NOME

ID_FUNCIONARIO_SUPERIOR

1

Ana

NULL

2

Bruno

1

3

Carla

2

A consulta da alternativa A retornaria:

F.NOME

F2.NOME

Bruno

Ana

Carla

Bruno

Perceba que Ana não aparece como funcionário, pois seu superior é NULL (ela é a chefe máxima). Esse é o comportamento esperado de uma junção interna (INNER JOIN) — apenas as linhas que têm correspondência são retornadas.

A pegadinha desta questão está na sintaxe e na lógica da junção. A banca explora erros comuns: inverter a ordem das colunas na condição, usar aliases incorretamente, ou simplesmente esquecer de usar dois aliases para a mesma tabela. O candidato que não domina o conceito de auto junção tende a se perder na análise das alternativas.

Guarde o critério decisivo: para uma auto junção funcionar, é obrigatório usar dois aliases diferentes para a mesma tabela e a condição de junção deve comparar a chave estrangeira (que referencia a própria tabela) com a chave primária. É exatamente nesse ponto que as alternativas se dividem.

Auto junção (self join)
  • 1Obrigatório
    • Dois aliases para a mesma tabela
    • FK = PK na condição
  • 2Erros comuns
    • Inverter a condição (ID = FK)
    • Comparar IDs iguais
    • Usar IS em vez de =
    • Sem junção (mesma linha)
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

Esta alternativa implementa corretamente a auto junção. Ela usa dois aliases (F e F2) para a tabela FUNCIONARIO e a condição WHERE F.ID_FUNCIONARIO_SUPERIOR = F2.ID relaciona cada funcionário (F) ao seu superior (F2), comparando a coluna que guarda o ID do superior com a coluna ID da outra instância da tabela. A sintaxe está correta e a lógica atende exatamente ao que o enunciado pede: retornar o nome de cada funcionário e o nome do seu superior.

Alternativa B — ❌ Incorreta

O erro está na condição de junção: WHERE ID = F2.ID_FUNCIONARIO_SUPERIOR. Aqui, a coluna ID (sem alias) é comparada com F2.ID_FUNCIONARIO_SUPERIOR. Isso inverte a lógica: estaria relacionando o ID do funcionário com o ID do superior de outro funcionário, o que não retorna o par funcionário-superior correto. Além disso, a primeira coluna do SELECT (NOME) não está qualificada com um alias, o que pode gerar ambiguidade, já que a tabela FUNCIONARIO aparece duas vezes na FROM.

Alternativa C — ❌ Incorreta

A condição WHERE FUNC.ID = SUP.ID compara os IDs de duas instâncias da mesma tabela, mas isso apenas relacionaria um funcionário com outro que possui o mesmo ID — o que não faz sentido, pois IDs são únicos. Para encontrar o superior, a comparação deveria ser entre FUNC.ID_FUNCIONARIO_SUPERIOR e SUP.ID, não entre os IDs diretamente.

Alternativa D — ❌ Incorreta

Esta alternativa apresenta dois erros graves. Primeiro, na cláusula FROM, o alias F2 é definido, mas a tabela não é especificada (FROM FUNCIONARIO F1, F2 — falta o nome da tabela para o alias F2). Segundo, a condição WHERE F.ID_FUNCIONARIO_SUPERIOR IS F2.ID usa a palavra IS para comparação de igualdade, o que é inválido em SQL — o correto seria usar =. Além disso, o alias F não foi definido na FROM, apenas F1.

Alternativa E — ❌ Incorreta

Esta alternativa não faz nenhuma junção. Ela consulta apenas uma instância da tabela FUNCIONARIO e tenta comparar ID com ID_FUNCIONARIO_SUPERIOR na mesma linha. Isso retornaria apenas os funcionários cujo ID é igual ao ID do seu superior — o que é logicamente impossível, pois um funcionário não pode ser superior de si mesmo. Para obter o nome do superior, seria necessário unir a tabela com ela mesma, o que não é feito aqui.

Gabarito: letra A

Link permanente: /questoes/qa537589