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:
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 com subconsulta correlacionada
Gabarito: letra B. A alternativa B é a única que usa corretamente uma subconsulta correlacionada: a subconsulta interna referencia a tabela externa funcionario F através do alias F.car_id, retornando o car_nome do cargo correspondente a cada funcionário. As demais alternativas ou usam alias incorretos, ou selecionam colunas erradas, ou fazem junções com tabelas inadequadas.
A questão cobra a habilidade de escrever uma consulta SQL que relacione duas tabelas — funcionario e cargo — apresentando o nome do funcionário e o nome do seu respectivo cargo. O modelo Entidade-Relacionamento (ER) da Figura 1 mostra que a tabela funcionario possui uma chave estrangeira car_id que referencia a tabela cargo, que por sua vez possui o atributo car_nome. O objetivo é, para cada funcionário, buscar o nome do cargo correspondente.
Existem duas abordagens principais para resolver esse problema em SQL: a junção (JOIN) e a subconsulta. A junção combina as tabelas com base na condição de igualdade das chaves, enquanto a subconsulta executa uma consulta aninhada para cada linha da consulta externa. Quando a subconsulta referencia colunas da consulta externa, ela é chamada de subconsulta correlacionada.
Na subconsulta correlacionada, o alias da tabela externa é fundamental. No comando SELECT fun_nome, (SELECT car_nome FROM cargo WHERE car_id = F.car_id) cargo FROM funcionario F, o alias F é definido na cláusula FROM e usado dentro da subconsulta para referenciar a coluna car_id da tabela externa. Isso garante que, para cada funcionário, a subconsulta retorne o nome do cargo cujo car_id coincide com o car_id do funcionário. Sem o alias correto, a subconsulta não consegue correlacionar as linhas e pode retornar resultados incorretos ou erros de ambiguidade.
A alternativa B é a única que atende a todos os requisitos: usa o alias F corretamente, seleciona fun_nome e car_nome, e correlaciona as tabelas pela chave estrangeira. As demais alternativas falham por diferentes motivos: a alternativa A usa um alias inexistente (nivel.car_id), a alternativa C seleciona car_id em vez de car_nome, a alternativa D seleciona niv_nome (que não existe na tabela cargo), e a alternativa E faz junção com a tabela nivel em vez de cargo.
Critério
Alternativa B (✅ correta)
Alternativa C
Alternativa D
Alternativa E
Coluna do cargo retornada
car_nome (nome do cargo)
car_id (identificador, não o nome)
niv_nome (coluna inexistente em cargo)
car_nome (nome do cargo)
Tabela de junção
Subconsulta correlacionada com cargo
cargo via INNER JOIN
cargo via junção implícita
nivel (tabela errada)
Alias da tabela externa usado corretamente
Sim (F.car_id na subconsulta)
Sim (F e C)
Sim (F e C)
Não (N em vez de C)
Resultado atende ao enunciado
Sim — nome do funcionário + nome do cargo
Não — retorna ID do cargo, não o nome
Não — coluna inexistente gera erro
Não — junção com tabela errada
Alternativa A — ❌ Incorreta
A alternativa A usa (select car_nome from cargo where F.car_id = nivel.car_id). O problema é que a subconsulta referencia nivel.car_id, mas a tabela nivel não é definida na consulta externa (o alias F é definido, mas nivel não existe). Isso gera um erro de sintaxe ou de referência a tabela inexistente. O correto seria usar F.car_id na condição, como na alternativa B.
Alternativa B — ✅ Correta ⟵ GABARITO
A alternativa B usa (select car_nome from cargo where car_id = F.car_id). Aqui, o alias F é definido na cláusula FROM e usado dentro da subconsulta para correlacionar as linhas. Para cada funcionário, a subconsulta retorna o car_nome do cargo cujo car_id coincide com o car_id do funcionário. Isso atende exatamente ao que o enunciado pede: apresentar o nome do funcionário e o nome do respectivo cargo.
Alternativa C — ❌ Incorreta
A alternativa C usa select F.fun_nome, C.car_id cargo from funcionario F inner join cargo C on F.car_id = C.car_id. O erro está em selecionar C.car_id em vez de C.car_nome. O enunciado pede o nome do cargo, não o identificador. A junção em si está correta, mas a coluna selecionada está errada.
Alternativa D — ❌ Incorreta
A alternativa D usa select F.fun_nome, C.niv_nome cargo from funcionario F, cargo C where F.car_id = C.car_id. O erro está em selecionar C.niv_nome, que não é uma coluna da tabela cargo (o atributo correto é car_nome). Além disso, a junção implícita (produto cartesiano com WHERE) funciona, mas a coluna selecionada não existe, gerando erro.
Alternativa E — ❌ Incorreta
A alternativa E usa select F.fun_nome, C.car_nome cargo from funcionario F, nivel N where F.car_id = N.car_id. O erro está em fazer a junção com a tabela nivel em vez de cargo. A tabela nivel não contém o atributo car_nome, e a condição F.car_id = N.car_id não relaciona funcionários a cargos. O correto seria juntar com a tabela cargo.
PEGA ESSA DICA!
Para identificar subconsultas correlacionadas, procure pelo alias da tabela externa dentro da subconsulta. Se a subconsulta referencia uma coluna da consulta externa, ela é correlacionada e o alias é essencial. Na prova, verifique sempre se o alias usado na subconsulta existe na cláusula FROM da consulta externa.