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
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
  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: 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

Condição de junção

produto.id = fornecimento.id_produto (igualdade correta)

A usa != (erro conceitual); B, C e E usam =

Filtro para 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.

Gabarito: letra D

Link permanente: /questoes/fg165234