Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
qa699085
Banca
FUNDATEC
Órgão
GHC
Ano
2025
Cargo
Prog ( )
Para responder à questão, considere o modelo Entidade-Relacionamento (ER) apresentado pela Figura 1 abaixo, bem como o dicionário de dados apresentado logo em seguida:
Figura 1 – Modelo Entidade-Relacionamento (ER)
Dicionário de dados
Qual alternativa contém a instrução SQL correta para apresentar a relação dos funcionários com seu respectivo cargo? A consulta deve apresentar o(s) nome(s) do(s) funcionário(s) e o nome do respectivo cargo.
Aselect fun_nome, (select car_nome from cargo where F.car_id = nivel.car_id) cargo from funcionario F
Bselect fun_nome, (select car_nome from cargo where car_id = F.car_id) cargo from funcionario F
Cselect F.fun_nome, C.car_id cargo from funcionario F inner join cargo C on F.car_id = C.car_id
Dselect F.fun_nome, C.niv_nome cargo from funcionario F, cargo C where F.car_id = C.car_id
Eselect F.fun_nome, C.car_nome cargo from funcionario F, nivel N where F.car_id = N.car_id
Revelar gabarito e comentário▾
GabaritoB — select fun_nome, (select car_nome from cargo where car_id = F.car_id) cargo
from funcionario F
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: subconsulta correlacionada para relacionar funcionário e cargo
Gabarito: letra B. A instrução correta usa uma subconsulta correlacionada que, para cada linha da tabela funcionario (aliás F), busca o nome do cargo na tabela cargo cujo car_id seja igual ao car_id daquela linha de funcionário — exatamente o que o enunciado pede: o nome do funcionário e o nome do respectivo cargo.
A questão testa dois conhecimentos que andam juntos: a leitura do modelo Entidade-Relacionamento (Figura 1) e a tradução desse modelo para uma consulta SQL. No DER, a entidade funcionario tem um atributo car_id que é chave estrangeira para a entidade cargo — ou seja, cada funcionário está associado a um cargo por esse identificador. O dicionário de dados confirma que a tabela cargo possui o atributo car_nome (nome do cargo) e a tabela funcionario possui fun_nome (nome do funcionário). A consulta precisa, portanto, cruzar essas duas tabelas pela chave car_id e projetar fun_nome e car_nome.
Existem duas formas clássicas de escrever essa consulta: com JOIN explícito ou com subconsulta correlacionada. A alternativa B usa a subconsulta correlacionada: para cada registro de funcionario F, a subconsulta (select car_nome from cargo where car_id = F.car_id) é executada, retornando o nome do cargo cujo car_id corresponde ao car_id do funcionário atual. O alias F na subconsulta referencia a tabela externa, criando a correlação — é isso que torna a consulta correta. A alternativa A tenta fazer o mesmo, mas erra ao referenciar nivel.car_id dentro da subconsulta, sendo que nivel não é uma tabela envolvida na consulta externa (e, pelo modelo, a tabela nivel nem sequer contém car_id — ela se relaciona com cargo por outro atributo).
A pegadinha central está em identificar qual coluna de qual tabela deve ser usada na condição de junção e qual coluna deve ser projetada como "cargo". O enunciado pede o nome do cargo (car_nome), não o identificador (car_id) nem o nome do nível (niv_nome). Além disso, a condição de junção deve comparar car_id da tabela funcionario com car_id da tabela cargo — nunca com car_id de nivel, pois nivel não é a tabela que contém o nome do cargo.
Vamos analisar cada alternativa com esse critério em mente: a projeção correta (fun_nome e car_nome) e a condição de junção correta (F.car_id = C.car_id).
Alternativa A — ❌ Incorreta
O erro está na subconsulta: (select car_nome from cargo where F.car_id = nivel.car_id). A condição compara F.car_id com nivel.car_id, mas a tabela nivel não está na consulta externa (o FROM só tem funcionario F) e, pelo modelo, nivel não possui car_id — ela se relaciona com cargo por outro atributo (provavelmente niv_id). A subconsulta deveria comparar F.car_id com cargo.car_id, como na alternativa B. Além disso, a projeção fun_nome sem o alias F. é válida, mas o problema está na condição incorreta.
Alternativa B — ✅ Correta ⟵ GABARITO
A subconsulta correlacionada está correta: (select car_nome from cargo where car_id = F.car_id). Para cada linha de funcionario F, a subconsulta busca o car_nome na tabela cargo onde o car_id é igual ao car_id daquela linha de funcionário. O alias F referencia a tabela externa, criando a correlação. A projeção fun_nome (nome do funcionário) e o alias cargo para o resultado da subconsulta (nome do cargo) atendem exatamente ao que o enunciado pede.
Alternativa C — ❌ Incorreta
A consulta usa INNER JOIN entre funcionario F e cargo C com a condição F.car_id = C.car_id, o que está correto. Porém, a projeção C.car_id cargo retorna o identificador do cargo, não o nome (car_nome). O enunciado pede o nome do cargo, então a coluna projetada está errada.
Alternativa D — ❌ Incorreta
A consulta usa junção implícita (produto cartesiano com WHERE) entre funcionario F e cargo C com a condição F.car_id = C.car_id, o que está correto. Porém, a projeção C.niv_nome cargo referencia a coluna niv_nome, que pertence à tabela nivel, não à tabela cargo. A tabela cargo não possui niv_nome — ela possui car_nome. A coluna projetada está errada.
Alternativa E — ❌ Incorreta
A consulta faz junção implícita entre funcionario F e nivel N com a condição F.car_id = N.car_id. Dois erros: (1) a tabela nivel não possui car_id — pelo modelo, nivel se relaciona com cargo por outro atributo; (2) a projeção C.car_nome referencia a tabela C, que não existe na consulta (o alias é N para nivel). Mesmo que nivel tivesse car_id, a tabela nivel não contém o nome do cargo — esse atributo está em cargo.
NÃO CAIA NESSA!
A banca troca a coluna projetada (usa car_id ou niv_nome em vez de car_nome) e a tabela na condição de junção (usa nivel em vez de cargo). O candidato que não lê o dicionário de dados com atenção cai na alternativa C ou D, que têm a junção correta mas a projeção errada. A alternativa E mistura tudo: tabela errada e coluna inexistente. Fique atento: o enunciado pede o nome do cargo, então a coluna projetada deve ser car_nome.
PEGA ESSA DICA!
Para resolver questões de SQL com DER, siga este roteiro: (1) identifique no dicionário de dados quais tabelas contêm as colunas pedidas no enunciado; (2) identifique a chave estrangeira que relaciona as tabelas; (3) monte a consulta com JOIN ou subconsulta, garantindo que a condição de junção use as colunas corretas e que a projeção use as colunas pedidas. Treine com questões que misturam JOIN e subconsulta correlacionada — a banca adora testar os dois formatos.