Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
qa699086
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 de cargos que não possuem algum funcionário relacionado? A consulta deve apresentar o(s) nome(s) desse(s) cargo(s).
Aselect car_nome from funcionario F right join cargo C on F.car_id = C.car_id where F.fun_id is null
Bselect car_nome from funcionario F left join cargo C on F.car_id = C.car_id where F.fun_id is null
Cselect car_nome from funcionario F right join cargo C on F.car_id = C.car_id where F.fun_id = null
Dselect car_nome from cargo C left join funcionario F on F.car_id = C.car_id where F.fun_id = null
Eselect car_nome from cargo C left join funcionario F on F.car_id = C.car_id where 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”.
Consultas SQL: LEFT JOIN e RIGHT JOIN para encontrar registros sem correspondência
Gabarito: letra A. Para listar os cargos que não possuem funcionários, é necessário usar um RIGHT JOIN partindo da tabela funcionario para a tabela cargo, garantindo que todos os cargos sejam retornados, e filtrar os registros onde F.fun_id IS NULL — exatamente o que a alternativa A faz. A alternativa B usa LEFT JOIN na ordem errada, e as demais apresentam erros de sintaxe ou de lógica.
O problema central desta questão é identificar os registros de uma tabela (cargos) que não possuem correspondência em outra (funcionários). Em SQL, isso é feito com uma junção externa (OUTER JOIN) que preserva todas as linhas de uma das tabelas, mesmo aquelas sem correspondência na outra, e depois filtrando os registros onde a coluna da tabela que deveria ter a correspondência está nula.
Existem dois tipos de junção externa relevantes: LEFT JOIN e RIGHT JOIN. A diferença está em qual tabela tem suas linhas preservadas:
LEFT JOIN: preserva todas as linhas da tabela à esquerda (a primeira no FROM).
RIGHT JOIN: preserva todas as linhas da tabela à direita (a segunda no FROM).
No caso, queremos todos os cargos, mesmo aqueles sem funcionários. Portanto, a tabela cargo deve ser a tabela preservada. Isso pode ser feito de duas formas:
Colocando cargo à esquerda e usando LEFT JOIN:
FROM cargo C LEFT JOIN funcionario F ON F.car_id = C.car_id
Colocando funcionario à esquerda e usando RIGHT JOIN:
FROM funcionario F RIGHT JOIN cargo C ON F.car_id = C.car_id
Ambas as formas são equivalentes e corretas. A alternativa A usa a segunda forma, que é válida.
Após a junção, precisamos filtrar apenas os cargos sem funcionários. Isso é feito verificando se a coluna fun_id (chave primária de funcionario) é nula. Quando um cargo não tem funcionário, a junção externa preenche as colunas de funcionario com NULL. Portanto, a condição WHERE F.fun_id IS NULL identifica exatamente esses cargos.
É crucial usar IS NULL e não = NULL. Em SQL, NULL não é um valor, mas a ausência de valor. Comparações com = sempre retornam desconhecido (UNKNOWN), nunca verdadeiro, então WHERE F.fun_id = NULL nunca retorna nenhuma linha. A forma correta de testar nulidade é IS NULL.
Vamos analisar cada alternativa em detalhe.
Critério
Alternativa A (Gabarito)
Alternativa B
Alternativa C
Alternativa D
Alternativa E
Tipo de JOIN
RIGHT JOIN (funcionario → cargo)
LEFT JOIN (funcionario → cargo)
RIGHT JOIN (funcionario → cargo)
LEFT JOIN (cargo → funcionario)
LEFT JOIN (cargo → funcionario)
Tabela preservada
cargo (correta)
funcionario (errada)
cargo (correta)
cargo (correta)
cargo (correta)
Condição de nulidade
IS NULL (correta)
IS NULL (correta)
= NULL (errada)
= NULL (errada)
has null (errada)
Resultado esperado
Cargos sem funcionários
Funcionários sem cargo
Nenhum resultado
Nenhum resultado
Erro de sintaxe
Alternativa A — ✅ Correta ⟵ GABARITO
Esta alternativa usa RIGHT JOIN com funcionario à esquerda e cargo à direita. O RIGHT JOIN preserva todas as linhas da tabela cargo, que é exatamente o que precisamos. A condição WHERE F.fun_id IS NULL filtra os cargos sem funcionários. A sintaxe está correta, usando IS NULL em vez de = NULL. Portanto, esta é a instrução SQL correta.
Alternativa B — ❌ Incorreta
Esta alternativa usa LEFT JOIN com funcionario à esquerda e cargo à direita. O LEFT JOIN preserva todas as linhas da tabela funcionario, não da tabela cargo. Isso significa que todos os funcionários serão retornados, mesmo aqueles sem cargo, mas os cargos sem funcionários não serão incluídos. Portanto, a consulta não retornará os cargos sem funcionários, mas sim os funcionários sem cargo (se houver). A lógica está invertida.
Alternativa C — ❌ Incorreta
Esta alternativa usa RIGHT JOIN corretamente, mas a condição WHERE F.fun_id = NULL está errada. Como explicado, = NULL nunca retorna verdadeiro, pois NULL não é um valor comparável. A forma correta é IS NULL. Portanto, a consulta não retornará nenhum resultado, mesmo que existam cargos sem funcionários.
Alternativa D — ❌ Incorreta
Esta alternativa usa LEFT JOIN com cargo à esquerda e funcionario à direita, o que está correto para preservar todos os cargos. No entanto, a condição WHERE F.fun_id = NULL está errada, pelo mesmo motivo da alternativa C. A forma correta é IS NULL. Portanto, a consulta não retornará os cargos sem funcionários.
Alternativa E — ❌ Incorreta
Esta alternativa usa LEFT JOIN com cargo à esquerda e funcionario à direita, o que está correto. No entanto, a condição WHERE F.fun_id has null é inválida. A sintaxe correta para testar nulidade é IS NULL, não has null. Portanto, a consulta apresentará um erro de sintaxe.
NÃO CAIA NESSA!
A banca explora duas armadilhas clássicas: (1) inverter a ordem das tabelas no LEFT JOIN/RIGHT JOIN, fazendo o candidato escolher a junção que preserva a tabela errada; (2) usar = NULL em vez de IS NULL, que é um erro sutil e comum. Na alternativa B, a ordem está invertida; nas alternativas C e D, o operador de nulidade está errado. Fique atento a esses dois detalhes — eles são os mais cobrados em questões de JOIN.
PEGA ESSA DICA!
Para resolver questões de JOIN que pedem registros sem correspondência, siga este roteiro: (1) identifique qual tabela deve ter todas as linhas preservadas (a tabela "principal"); (2) coloque essa tabela no lado correto do JOIN (à esquerda para LEFT JOIN, à direita para RIGHT JOIN); (3) use IS NULL na coluna da outra tabela para filtrar os registros sem correspondência. Lembre-se: = NULL nunca funciona.