Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165234
Banca
FGV
Órgão
ALETO
Ano
2024
Cargo
Ana Leg ( )
Considere o seguinte script SQL de um banco de dados relacional: create table fornecedor ( id integer primary key, nome varchar(30) not null ); create table produto ( id integer primary key, descricao varchar(40) not null ); create table fornecimento ( id_fornecedor integer references fornecedor, id_produto integer references produto, primary key(id_fornecedor,id_produto) ); Assinale a consulta que imprime a descrição dos produtos que não são fornecidos por nenhum fornecedor
Aselect produto.descricao from produto join fornecimento on produto.id != fornecimento.id_produto
Bselect produto.descricao from produto join fornecimento on produto.id = fornecimento.id_produto where id_fornecedor > all (select id from fornecedor)
Cselect produto.descricao from produto join fornecimento on produto.id = fornecimento.id_produto
Dselect produto.descricao from produto left join fornecimento on produto.id = fornecimento.id_produto where fornecimento.id_fornecedor is null
Eselect produto.descricao from produto right join fornecimento on produto.id = fornecimento.id_produto join fornecedor on fornecedor.id = fornecimento.id_fornecedor
Revelar gabarito e comentário▾
GabaritoD — select produto.descricao from produto left join
fornecimento on produto.id =
fornecimento.id_produto where
fornecimento.id_fornecedor 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: junções e produtos sem fornecimento
Gabarito: letra D. A consulta correta usa um LEFT JOIN entre produto e fornecimento, mantendo todos os produtos mesmo sem correspondência, e filtra as linhas em que fornecimento.id_fornecedor IS NULL — exatamente os produtos sem nenhum fornecimento. As demais alternativas ou usam JOIN interno (que descarta produtos sem fornecimento) ou têm condições incorretas.
O problema pede para listar os produtos que não aparecem na tabela fornecimento. Em SQL, a forma mais direta é usar uma junção externa à esquerda (LEFT JOIN): ela preserva todas as linhas da tabela à esquerda (produto) e, para aquelas sem correspondência na tabela à direita (fornecimento), preenche as colunas desta com NULL. Depois, basta filtrar WHERE fornecimento.id_fornecedor IS NULL — assim, ficam apenas os produtos que não têm nenhum registro de fornecimento.
Vamos entender o esquema: fornecedor(id, nome), produto(id, descricao) e fornecimento(id_fornecedor, id_produto), onde a chave primária composta (id_fornecedor, id_produto) garante que cada par seja único. A tabela fornecimento é a tabela de associação (ou tabela ponte) que liga fornecedores a produtos. Um produto "não fornecido por nenhum fornecedor" é aquele que não possui nenhuma linha em fornecimento com seu id_produto.
A alternativa D implementa exatamente isso:
select produto.descricao
from produto
left join fornecimento on produto.id = fornecimento.id_produto
where fornecimento.id_fornecedor is null
O LEFT JOIN garante que todos os produtos apareçam no resultado; os que não têm fornecimento terão id_fornecedor e id_produto como NULL. O filtro IS NULL seleciona apenas esses. É o padrão clássico para "registros sem correspondência".
Uma alternativa equivalente seria usar NOT EXISTS ou NOT IN, mas a banca optou pela junção externa. As outras opções falham por diferentes motivos, como veremos a seguir.
NÃO CAIA NESSA!
A banca explora a confusão entre JOIN interno e LEFT JOIN. O JOIN interno (alternativas B e C) descarta automaticamente os produtos sem fornecimento, então eles nunca aparecem no resultado — o que é o oposto do que se pede. Já a alternativa A usa uma condição != no JOIN, o que é um erro conceitual grave: ela relaciona produtos com fornecimentos de outros produtos, gerando resultados absurdos. A pegadinha está em reconhecer que, para listar o que não existe, é preciso preservar as linhas sem correspondência (LEFT JOIN) e depois filtrar os NULL.
Critério
Alternativa D (correta)
Alternativas A, B, C, E (incorretas)
Tipo de junção
LEFT JOIN (preserva todos os produtos)
JOIN interno (A, B, C) ou RIGHT JOIN (E) — descartam produtos sem fornecimento
WHERE fornecimento.id_fornecedor IS NULL (seleciona apenas os sem correspondência)
Nenhum filtro equivalente; B tem condição impossível (> ALL)
Resultado
Apenas produtos sem nenhum registro em fornecimento
Produtos com fornecimento (B, C, E) ou resultado absurdo (A)
Alternativa A — ❌ Incorreta
Usa JOIN com condição produto.id != fornecimento.id_produto. Isso é um erro conceitual: a condição de junção deve ser de igualdade (=), não de diferença. Com !=, o banco relaciona cada produto com fornecimentos de outros produtos, gerando um produto cartesiano filtrado incorretamente. Além disso, mesmo que a condição fosse =, o JOIN interno descartaria os produtos sem fornecimento. Portanto, está totalmente errada.
Alternativa B — ❌ Incorreta
Usa JOIN interno (produto join fornecimento on produto.id = fornecimento.id_produto), que já elimina os produtos sem fornecimento. Além disso, a condição where id_fornecedor > all (select id from fornecedor) é logicamente impossível: id_fornecedor é uma chave estrangeira que referencia fornecedor.id, então nunca será maior que todos os ids de fornecedores (no máximo será igual a um deles). O > ALL retornaria falso para todas as linhas, resultando em conjunto vazio. Duplamente errada.
Alternativa C — ❌ Incorreta
Usa JOIN interno (produto join fornecimento on produto.id = fornecimento.id_produto). Isso retorna apenas os produtos que têm fornecimento, exatamente o oposto do que se pede. Não há filtro para excluir os que têm fornecimento; portanto, os produtos sem fornecimento ficam de fora do resultado.
Alternativa D — ✅ Correta ⟵ GABARITO
Como explicado, o LEFT JOIN preserva todos os produtos, e o WHERE fornecimento.id_fornecedor IS NULL seleciona apenas aqueles sem nenhum registro em fornecimento. É a implementação correta do requisito "produtos que não são fornecidos por nenhum fornecedor".
Alternativa E — ❌ Incorreta
Usa RIGHT JOIN entre produto e fornecimento, o que preserva todas as linhas de fornecimento (não de produto). Como fornecimento só contém pares válidos, o resultado incluirá apenas produtos que têm fornecimento — os sem fornecimento não aparecem. Além disso, o JOIN adicional com fornecedor não muda esse comportamento. Portanto, não atende ao pedido.