Questão nº 62
Questão de Banco de Dados · FGV CGU 2021 - Tarde (nº 62)
Considere as tabelas cliente e visita, conforme as instâncias exibidas a seguir.
Com relação às tabelas cliente e visita, descritas anteriormente, o comando SQL que deleta corretamente os clientes que nunca visitaram o site é:
- A```sql
delete from cliente
where not exists
(select * from visita v
where v.codigo in cliente.codigo)
``` - B```sql
delete from cliente
where not exists
(select * from visita v
where v.codigo <> cliente.codigo)
``` - C```sql
delete from cliente
where codigo in (select codigo from visita)
``` - D```sql
delete from cliente
where codigo <> ALL (select codigo from visita)
``` (alternativa correta) - E```sql
delete from cliente
where (select count(*) from visita v
where v.codigo <> cliente.codigo) > 0
```
Resposta comentada
Gabarito Alternativa D
Conceito-chave: NOT EXISTS e <> ALL são usados para encontrar registros que não têm correspondência em outra tabela. A pegadinha está em comparar a chave primária (codigo) com a chave estrangeira (v.codigo), que têm o mesmo nome, mas representam coisas diferentes: na tabela visita, codigo é o código do cliente que visitou, não um código próprio da visita.
- (A) Incorreta: A sintaxe
where v.codigo in cliente.codigoé inválida — falta parênteses emin (cliente.codigo), e mesmo corrigida,inverifica se o código da visita está na lista de códigos de cliente, o que é o oposto do desejado (deletaria quem visitou, não quem não visitou). - (B) Incorreta:
v.codigo <> cliente.codigocompara cada visita com todos os clientes diferentes, e comoNOT EXISTSexige que nenhuma linha atenda à condição, isso só deletaria clientes que não têm nenhuma visita de outro cliente — na prática, deletaria quase ninguém ou todos, dependendo dos dados, mas nunca o conjunto correto. - (C) Incorreta:
codigo in (select codigo from visita)seleciona clientes que têm visita, exatamente o oposto do que se quer (deletaria quem visitou, não quem nunca visitou). - (D) Correta:
codigo <> ALL (select codigo from visita)significa "o código do cliente é diferente de todos os códigos de visita", ou seja, o cliente não aparece em nenhuma visita — exatamente os clientes que nunca visitaram o site. - (E) Incorreta:
count(*) > 0comv.codigo <> cliente.codigoconta visitas de outros clientes, não do cliente atual; um cliente que nunca visitou teria contagem 0, mas um cliente que visitou também pode ter contagem 0 se só houver uma visita dele, então não identifica corretamente o conjunto.
Fonte: FGV CGU 2021 - Tarde Auditor Federal de Finanças e Controle - Área Tecnologia da Informação (Caderno Tipo 1). Reproduzida para fins de estudo.
