Considere o seguinte script SQL de um banco de dados relacional: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: LEFT JOIN para encontrar registros sem correspondência
Gabarito: letra D. A consulta correta usa LEFT JOIN entre produto e fornecimento, preservando todos os produtos e, em seguida, filtra com WHERE fornecimento.id_fornecedor IS NULL para manter apenas os produtos que não possuem nenhum registro de fornecimento. Essa é a técnica padrão em SQL para encontrar registros de uma tabela que não têm correspondência em outra.
O problema pede para listar os produtos que não são fornecidos por nenhum fornecedor. Em um banco relacional, a relação entre produto e fornecedor é feita através da tabela associativa fornecimento, que contém as chaves estrangeiras id_produto e id_fornecedor. Um produto que não é fornecido por ninguém simplesmente não aparece em nenhuma linha de fornecimento. Portanto, precisamos identificar os produtos que não possuem nenhum registro na tabela fornecimento.
A forma mais direta e idiomática de fazer isso em SQL é usar um LEFT JOIN (ou LEFT OUTER JOIN). O LEFT JOIN retorna todas as linhas da tabela à esquerda (no caso, produto), mesmo que não haja correspondência na tabela à direita (fornecimento). Quando não há correspondência, as colunas da tabela à direita vêm preenchidas com NULL. Assim, ao filtrar com WHERE fornecimento.id_fornecedor IS NULL, ficamos apenas com os produtos que não têm nenhum fornecimento associado.
Vamos entender por que as outras alternativas estão erradas:
A) Usa JOIN (inner join) com condição produto.id != fornecimento.id_produto. Isso retorna produtos que têm fornecimento para outros produtos, não os que não têm fornecimento. Além disso, um produto pode aparecer várias vezes, e produtos sem fornecimento não aparecem.
B) Usa JOIN (inner join) e depois WHERE id_fornecedor > all (select id from fornecedor). Essa condição é sempre falsa, pois id_fornecedor nunca é maior que todos os IDs de fornecedores (a menos que seja NULL, mas o inner join já exclui NULLs). Resultado: nenhuma linha.
C) Usa JOIN (inner join) simples, que retorna apenas produtos que têm fornecimento. Exclui justamente os que não têm.
E) Usa RIGHT JOIN de produto com fornecimento, seguido de JOIN com fornecedor. O RIGHT JOIN preserva todas as linhas de fornecimento, e o JOIN com fornecedor elimina as linhas onde id_fornecedor é NULL (que seriam os produtos sem fornecimento). Resultado: apenas produtos com fornecedor.
A pegadinha aqui é que muitos candidatos confundem LEFT JOIN com RIGHT JOIN ou esquecem de filtrar os NULL. A chave é lembrar: para encontrar registros sem correspondência, use LEFT JOIN na tabela que você quer preservar e filtre IS NULL na coluna da outra tabela.
1LEFT JOIN produto → fornecimento
2Preserva todos os produtos
3Sem correspondência = NULL
4WHERE id_fornecedor IS NULL
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
O JOIN (inner join) com condição produto.id != fornecimento.id_produto não retorna produtos sem fornecimento. Ele retorna produtos que têm fornecimento para outros produtos, o que é semanticamente errado. Além disso, produtos sem fornecimento não aparecem no resultado, pois o inner join exige correspondência.
Alternativa B — ❌ Incorreta
A condição id_fornecedor > all (select id from fornecedor) é logicamente impossível de ser verdadeira, pois id_fornecedor nunca é maior que todos os IDs de fornecedores (a menos que seja NULL, mas o inner join já exclui NULLs). Portanto, a consulta retorna um conjunto vazio.
Alternativa C — ❌ Incorreta
O JOIN (inner join) simples retorna apenas produtos que têm fornecimento. Produtos sem fornecimento não aparecem, pois não há linha correspondente em fornecimento. É exatamente o oposto do que se pede.
Alternativa D — ✅ Correta ⟵ GABARITO
O LEFT JOIN preserva todos os produtos, mesmo os sem fornecimento. A condição WHERE fornecimento.id_fornecedor IS NULL filtra apenas os produtos que não têm nenhum registro de fornecimento. Essa é a técnica correta e padrão para encontrar registros sem correspondência.
Alternativa E — ❌ Incorreta
O RIGHT JOIN preserva todas as linhas de fornecimento, e o JOIN com fornecedor elimina as linhas onde id_fornecedor é NULL. Como produtos sem fornecimento não têm linha em fornecimento, eles não aparecem. O resultado são apenas produtos com fornecedor.
PEGA ESSA DICA!
Para encontrar registros sem correspondência, use LEFT JOIN na tabela que você quer preservar e filtre IS NULL na coluna da outra tabela. Lembre-se: LEFT JOIN preserva a tabela da esquerda; RIGHT JOIN preserva a da direita. Aqui, queremos preservar produto, então LEFT JOIN é o caminho.