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 de cargos que não possuem algum funcionário relacionado? A consulta deve apresentar o(s) nome(s) desse(s) cargo(s).
Aselect car_nomefrom funcionario F right join cargo Con F.car_id = C.car_idwhere F.fun_id is null
Bselect car_nomefrom funcionario F left join cargo Con F.car_id = C.car_idwhere F.fun_id is null
Cselect car_nomefrom funcionario F right join cargo Con F.car_id = C.car_idwhere F.fun_id = null
Dselect car_nomefrom cargo C left join funcionario Fon F.car_id = C.car_idwhere F.fun_id = null
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:
FROM funcionario RIGHT JOIN cargo — o cargo está à direita, então é preservado.
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.