Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas e Comandos em SQL
Código
fg165226
Banca
FGV
Órgão
ALEP
Ano
2024
Cargo
Ana Leg ( )
Considere o esquema relacional a seguir, implementado em SQL.   create table recurso ( id integer primary key, nome varchar(20) not null, valor real ); create table projeto ( id integer primary key, nome varchar(20) not null, verba real ); create table alocacao ( id_recurso integer, id_projeto integer, primary key(id_recurso,id_projeto), foreign key(id_recurso) references recurso, foreign key(id_projeto) references projeto );   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 null   apresenta 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”.

Comando SELECT com LEFT JOIN e filtro de NULL

Gabarito: letra A. A consulta select r.nome from recurso r left join alocacao a on a.id_recurso=r.id where a.id_projeto is null retorna os nomes dos recursos que não possuem nenhuma alocação em projeto, ou seja, recursos alocados a nenhum projeto. O LEFT JOIN preserva todos os registros da tabela à esquerda (recurso), e o filtro WHERE a.id_projeto IS NULL seleciona exatamente aqueles que não encontraram correspondência na tabela alocacao.

O LEFT JOIN (ou LEFT OUTER JOIN) é uma operação de junção externa que retorna todas as linhas da tabela à esquerda (a primeira tabela mencionada no FROM), combinadas com as linhas correspondentes da tabela à direita quando a condição de junção é satisfeita. Quando não há correspondência, as colunas da tabela à direita são preenchidas com NULL. Esse é o comportamento central que a questão explora.

Na prática, considere um banco com os seguintes dados:

  • recurso: (1, 'Martelo'), (2, 'Serra'), (3, 'Furadeira')

  • projeto: (10, 'Construção'), (20, 'Reforma')

  • alocacao: (1, 10) — o recurso 1 (Martelo) está alocado ao projeto 10

Executando a consulta:

  1. O LEFT JOIN combina cada recurso com suas alocações: o Martelo (id=1) encontra a alocação (1,10); a Serra (id=2) e a Furadeira (id=3) não encontram nenhuma alocação, então as colunas de alocacao ficam NULL para elas.

  2. O WHERE a.id_projeto IS NULL filtra apenas as linhas em que id_projeto é NULL — ou seja, Serra e Furadeira.

  3. O SELECT r.nome retorna 'Serra' e 'Furadeira'.

Portanto, a consulta devolve os recursos que não estão alocados a nenhum projeto. A alternativa A expressa exatamente isso.

A pegadinha da banca está em confundir o LEFT JOIN com outros tipos de junção ou com o significado do NULL resultante. Muitos candidatos podem pensar que o LEFT JOIN retorna apenas os recursos que têm alocação (o que seria um INNER JOIN), ou que o filtro IS NULL se refere a algo na tabela recurso. A chave é entender que o NULL aqui vem da ausência de correspondência na tabela alocacao, e o filtro seleciona justamente os recursos sem alocação.

Para fixar, compare os tipos de junção:

Tipo de Junção

O que retorna

INNER JOIN

Apenas linhas com correspondência em ambas as tabelas

LEFT JOIN

Todas as linhas da esquerda + correspondências da direita (ou NULL quando não há)

RIGHT JOIN

Todas as linhas da direita + correspondências da esquerda (ou NULL quando não há)

FULL OUTER JOIN

Todas as linhas de ambas as tabelas, com NULL onde não há correspondência

Guarde essa distinção: é exatamente ela que separa a alternativa correta das demais.

Alternativa A — ✅ Correta ⟵ GABARITO

A consulta retorna os recursos que não possuem nenhuma linha correspondente na tabela alocacao, ou seja, que não estão alocados a nenhum projeto. O LEFT JOIN preserva todos os recursos, e o WHERE a.id_projeto IS NULL filtra aqueles sem alocação. É exatamente o que a alternativa afirma.

Alternativa B — ❌ Incorreta

Afirma que a consulta retorna recursos "designados a projetos com verba alocada". Isso seria o resultado de um INNER JOIN entre recurso, alocacao e projeto com filtro de verba, não de um LEFT JOIN com filtro de NULL. A consulta não verifica verba de projeto em nenhum momento — ela apenas identifica recursos sem alocação.

Alternativa C — ❌ Incorreta

"Distribuídos à esquerda de projetos" é uma interpretação literal e equivocada do termo "left join". O LEFT JOIN não tem relação com posição física ou distribuição espacial; é uma operação lógica de junção que preserva as linhas da tabela à esquerda. A alternativa confunde a nomenclatura técnica com um significado coloquial.

Alternativa D — ❌ Incorreta

"Reservados a projetos com identificação nula" inverte o sentido da consulta. O filtro a.id_projeto IS NULL identifica recursos que não têm projeto associado, não projetos com id nulo. Além disso, a coluna id_projeto é parte da chave primária de alocacao e, por ser NOT NULL na definição da tabela (implícito na chave primária), nunca seria nula em uma linha existente de alocacao.

Alternativa E — ❌ Incorreta

"Vinculados a projetos sem nomes cadastrados" não corresponde ao que a consulta faz. A tabela projeto tem a coluna nome definida como NOT NULL, então não há projetos sem nome. Além disso, a consulta não acessa a tabela projeto em momento algum — ela apenas junta recurso com alocacao e filtra por NULL.

Gabarito: letra A

Link permanente: /questoes/fg165226