Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg075962
Banca
FGV
Órgão
AL-TO
Ano
2024
Nível
Superior
Cargo
Analista Legislativo - Desenvolvimento de Sistema
Considere o seguinte script SQL de um banco de dados relacional:Imagem associada para resolução da questãoAssinale a consulta que imprime a descrição dos produtos que não são fornecidos por nenhum fornecedor
  1. Aselect produto.descricao from produto join fornecimento on produto.id != fornecimento.id_produto
  2. Bselect produto.descricao from produto join fornecimento on produto.id = fornecimento.id_produto where id_fornecedor > all (select id from fornecedor)
  3. Cselect produto.descricao from produto join fornecimento on produto.id = fornecimento.id_produto
  4. Dselect produto.descricao from produto left join fornecimento on produto.id = fornecimento.id_produto where fornecimento.id_fornecedor is null
  5. 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.

  1. 1LEFT JOIN produto → fornecimento
  2. 2Preserva todos os produtos
  3. 3Sem correspondência = NULL
  4. 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.

Gabarito: letra D

Link permanente: /questoes/fg075962