Para responder à questão, considere a Figura 2 abaixo:
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.
DSELECT F1.NOME, F2.NOMEFROM FUNCIONARIO F1, F2WHERE F.ID_FUNCIONARIO_SUPERIOR IS F2.ID
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.