Pular para o conteúdo principal

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

Banco de DadosSQL
Código
qg472041
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 de cargos que não possuem algum funcionário relacionado? A consulta deve apresentar o(s) nome(s) desse(s) cargo(s).
  1. Aselect car_nomefrom funcionario F right join cargo Con F.car_id = C.car_idwhere F.fun_id is null
  2. Bselect car_nomefrom funcionario F left join cargo Con F.car_id = C.car_idwhere F.fun_id is null
  3. Cselect car_nomefrom funcionario F right join cargo Con F.car_id = C.car_idwhere F.fun_id = null
  4. Dselect car_nomefrom cargo C left join funcionario Fon F.car_id = C.car_idwhere F.fun_id = null
  5. Eselect car_nomefrom cargo C left join funcionario Fon F.car_id = C.car_idwhere F.fun_id has null
Revelar gabarito e comentário

GabaritoA — select car_nome from funcionario F right join cargo C on F.car_id = C.car_id where F.fun_id is null

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”.

SQL: LEFT JOIN e RIGHT JOIN para encontrar registros sem correspondência

Gabarito: letra A. Para listar cargos sem funcionários, é preciso preservar todos os registros da tabela cargo (mesmo os sem correspondência em funcionario) e filtrar os que não têm funcionário associado. Isso exige um RIGHT JOIN partindo de funcionario (alternativa A) ou um LEFT JOIN partindo de cargo (alternativa D), mas a alternativa D usa = null em vez de is null, o que a torna incorreta. A alternativa A é a única que combina corretamente o tipo de junção com a condição de filtro.

O problema pede para encontrar cargos que não possuem nenhum funcionário relacionado. Em SQL, isso é um clássico caso de junção externa (OUTER JOIN) seguida de um filtro por valores nulos. A lógica é: juntar as tabelas funcionario e cargo preservando todos os registros de cargo, e depois selecionar apenas as linhas onde o funcionário é nulo — ou seja, onde não houve correspondência.

A diferença entre LEFT JOIN e RIGHT JOIN está em qual tabela tem seus registros preservados:

Tipo de JOIN

Tabela preservada (todos os registros)

Tabela que pode ter nulos

LEFT JOIN

A primeira (à esquerda)

A segunda (à direita)

RIGHT JOIN

A segunda (à direita)

A primeira (à esquerda)

No caso, queremos preservar todos os cargos. Portanto, o cargo deve ser a tabela preservada. Isso acontece em duas configurações:

  1. FROM funcionario RIGHT JOIN cargo — o cargo está à direita, então é preservado.

  2. FROM cargo LEFT JOIN funcionario — o cargo está à esquerda, então é preservado.

Ambas as abordagens são logicamente equivalentes. A alternativa A usa a primeira configuração e a alternativa D usa a segunda. A diferença crucial está na condição de filtro:

  • WHERE F.fun_id is null — correto. O operador IS NULL é a forma padrão de testar nulos em SQL.

  • WHERE F.fun_id = null — incorreto. O operador = não funciona com nulos; o resultado é sempre desconhecido (NULL), e a linha não é retornada.

A alternativa E usa has null, que não é um operador SQL válido.

A pegadinha da banca está em duas frentes: (1) inverter o tipo de junção (LEFT/RIGHT) sem ajustar a ordem das tabelas, e (2) usar = null em vez de is null. O candidato que domina a semântica das junções externas e o tratamento de nulos resolve a questão sem dificuldade.

Alternativa A — ✅ Correta ⟵ GABARITO

A consulta usa RIGHT JOIN, preservando todos os registros da tabela cargo (à direita). A condição WHERE F.fun_id is null filtra exatamente as linhas onde não houve correspondência com funcionario, ou seja, cargos sem funcionários. A combinação está correta.

Alternativa B — ❌ Incorreta

Usa LEFT JOIN com funcionario à esquerda. Isso preserva todos os funcionários, não todos os cargos. O resultado incluiria funcionários sem cargo (se houvesse), mas não cargos sem funcionários. A lógica está invertida.

Alternativa C — ❌ Incorreta

O tipo de junção está correto (RIGHT JOIN preserva cargo), mas a condição WHERE F.fun_id = null está errada. O operador = não testa nulos; o correto é IS NULL. O resultado seria um conjunto vazio.

Alternativa D — ❌ Incorreta

A junção está correta (LEFT JOIN com cargo à esquerda preserva todos os cargos), mas a condição WHERE F.fun_id = null está errada pelo mesmo motivo da alternativa C. O operador = não funciona com nulos.

Alternativa E — ❌ Incorreta

A junção está correta, mas WHERE F.fun_id has null é sintaxe inválida. O operador HAS NULL não existe em SQL; o correto é IS NULL.

NÃO CAIA NESSA!

A banca explora duas confusões clássicas: (1) inverter LEFT/RIGHT sem ajustar a ordem das tabelas — o candidato que decora a sintaxe sem entender a semântica erra; (2) usar = null em vez de is null — o operador = com nulo sempre retorna desconhecido, nunca verdadeiro. Com treino, você enxerga essas trocas de longe 💪

PEGA ESSA DICA!

Para questões de "registros sem correspondência", identifique primeiro qual tabela deve ter todos os registros preservados. Depois, escolha o JOIN que coloca essa tabela no lado preservado (esquerda para LEFT, direita para RIGHT). Por fim, filtre com IS NULL na coluna da outra tabela. Esse padrão resolve a maioria das questões do tema.

Gabarito: letra A

Link permanente: /questoes/qg472041