Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023
Banco de Dados›Consultas e Comandos em SQL
Código
qa537589
Banca
FUNDATEC
Órgão
IFFAR
Ano
2023
Cargo
Tec ( )
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.
ASELECT F.NOME, F2.NOME FROM FUNCIONARIO F, FUNCIONARIO F2 WHERE F.ID_FUNCIONARIO_SUPERIOR = F2.ID
BSELECT NOME, F2.NOME FROM FUNCIONARIO, FUNCIONARIO F2 WHERE ID = F2.ID_FUNCIONARIO_SUPERIOR
CSELECT FUNC.NOME, SUP.NOME FROM FUNCIONARIO FUNC, FUNCIONARIO SUP WHERE FUNC.ID = SUP.ID
DSELECT F1.NOME, F2.NOME FROM FUNCIONARIO F1, F2 WHERE F.ID_FUNCIONARIO_SUPERIOR IS F2.ID
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.