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:
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.
O WHERE a.id_projeto IS NULL filtra apenas as linhas em que id_projeto é NULL — ou seja, Serra e Furadeira.
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