Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2025

Banco de DadosSQL
Código
qg472042
Banca
FUNDATEC
Órgão
GHC-RS
Ano
2025
Nível
Médio
Cargo
Programador
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:


Imagem da questão
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.
  1. Aselect fun_nome, (select car_nome from cargo where F.car_id = nivel.car_id) cargo from funcionario F
  2. Bselect fun_nome, (select car_nome from cargo where car_id = F.car_id) cargo from funcionario F
  3. Cselect F.fun_nome, C.car_id cargo from funcionario F inner join cargo C on F.car_id = C.car_id
  4. Dselect F.fun_nome, C.niv_nome cargo from funcionario F, cargo C where F.car_id = C.car_id
  5. 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.

Gabarito: letra B

Link permanente: /questoes/qg472042