Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — FGV 2024

Banco de DadosBanco de Dados Relacionais
Código
fg075129
Banca
FGV
Órgão
AL-PR
Ano
2024
Nível
Superior
Cargo
Analista Legislativo - Desenvolvedor de Sistemas

Considere o esquema relacional a seguir, implementado em SQL.



Imagem da questão

A saída gerada pela consulta:select r.nome from recurso r left join alocacao a on a.id_recurso=r.id where a.id_projeto is nullapresenta o nome dos recursos
  1. Aalocados a nenhum projeto.
  2. Bdesignados a projetos com verba alocada.
  3. Cdistribuídos à esquerda de projetos.
  4. Dreservados a projetos com identificação nula.
  5. Evinculados a projetos sem nomes cadastrados.
Revelar gabarito e comentário

GabaritoA — alocados a nenhum projeto.

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 com filtro de NULL

Gabarito: letra A. A consulta retorna os nomes dos recursos que não possuem nenhuma alocação a projeto, ou seja, recursos alocados a nenhum projeto. Isso ocorre porque o LEFT JOIN preserva todas as linhas da tabela à esquerda (recurso) e, para os recursos sem correspondência em alocacao, preenche as colunas da direita com NULL; o filtro WHERE a.id_projeto IS NULL seleciona exatamente esses registros.

O LEFT JOIN (ou LEFT OUTER JOIN) é uma operação da álgebra relacional que combina duas tabelas, mantendo todas as linhas da tabela à esquerda (a primeira mencionada no FROM) e trazendo as colunas da tabela à direita apenas quando há correspondência na condição de junção (ON). Quando não há correspondência, as colunas da tabela da direita são preenchidas com NULL. No caso da consulta, a tabela recurso é a da esquerda e alocacao é a da direita. A condição de junção é a.id_recurso = r.id, ou seja, relaciona cada recurso com suas alocações.

O filtro WHERE a.id_projeto IS NULL atua após a junção, selecionando apenas as linhas em que a coluna id_projeto da tabela alocacao é NULL. Isso acontece justamente para os recursos que não têm nenhuma linha correspondente em alocacao — ou seja, recursos que nunca foram alocados a nenhum projeto. Portanto, a consulta lista os nomes dos recursos que estão sem alocação.

Para entender melhor, considere um exemplo: se a tabela recurso tem os recursos 'Martelo', 'Serra' e 'Parafuso', e a tabela alocacao tem apenas uma linha alocando 'Martelo' ao projeto 1, o LEFT JOIN produzirá:

r.nome

a.id_projeto

Martelo

1

Serra

NULL

Parafuso

NULL

O filtro WHERE a.id_projeto IS NULL seleciona apenas 'Serra' e 'Parafuso', que são os recursos não alocados.

A pegadinha da questão está em interpretar corretamente o efeito do LEFT JOIN combinado com o filtro de NULL. Muitos candidatos confundem com um INNER JOIN (que retornaria apenas os recursos com alocação) ou com um RIGHT JOIN (que preservaria as linhas da direita). A chave é lembrar que o LEFT JOIN preserva a tabela da esquerda e o filtro IS NULL captura exatamente os registros sem correspondência.

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa A está correta porque a consulta retorna os nomes dos recursos que não possuem nenhuma alocação a projeto. O LEFT JOIN preserva todos os recursos, e o filtro WHERE a.id_projeto IS NULL seleciona aqueles cuja coluna id_projeto é NULL, o que ocorre apenas quando não há linha correspondente em alocacao. Portanto, são recursos alocados a nenhum projeto.

Alternativa B — ❌ Incorreta

A alternativa B está incorreta porque a consulta retorna recursos sem alocação, não recursos designados a projetos com verba alocada. O filtro IS NULL exclui justamente os recursos que têm alocação, independentemente de a verba estar alocada ou não. A alternativa descreveria um cenário com INNER JOIN e algum filtro de verba, o que não é o caso.

Alternativa C — ❌ Incorreta

A alternativa C está incorreta porque "distribuídos à esquerda de projetos" não tem significado técnico em SQL. O termo "esquerda" refere-se à tabela preservada no LEFT JOIN, mas não descreve o resultado da consulta. A consulta retorna recursos sem alocação, não recursos distribuídos de alguma forma específica.

Alternativa D — ❌ Incorreta

A alternativa D está incorreta porque a consulta retorna recursos cuja coluna id_projeto é NULL, mas isso não significa que os projetos tenham identificação nula. O NULL está na tabela alocacao, indicando ausência de alocação, não que exista um projeto com id nulo. A alternativa confunde o NULL resultante da junção com um valor nulo em uma coluna de projeto.

Alternativa E — ❌ Incorreta

A alternativa E está incorreta porque a consulta não envolve nomes de projetos. Ela retorna nomes de recursos (r.nome), e o filtro é sobre a.id_projeto, não sobre nomes de projetos. A alternativa descreveria uma consulta que filtra projetos sem nome, o que não é o caso.

Gabarito: letra A

Link permanente: /questoes/fg075129