Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg047171
Banca
FGV
Órgão
CGU
Ano
2022
Nível
Superior
Cargo
Auditor Federal de Finanças e Controle - Tecnologia da Informação
Com relação às tabelas cliente e visita, descritas anteriormente, o comando SQL que deleta corretamente os clientes que nunca visitaram o site é:
  1. Adelete from clientewhere not exists(select * from visita vwhere v.codigo in cliente.codigo)
  2. Bdelete from clientewhere not exists(select * from visita vwhere v.codigo <> cliente.codigo)
  3. Cdelete from clientewhere codigo in (select codigo from visita)
  4. Ddelete from clientewhere codigo <> ALL (select codigo from visita)
  5. Edelete from clientewhere (select count(*) from visita vwhere v.codigo <> cliente.codigo) > 0
Revelar gabarito e comentário

GabaritoD — delete from cliente where codigo <> ALL (select codigo from visita)

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”.

Comando SQL para deletar clientes que nunca visitaram

Gabarito: letra D. A alternativa D utiliza codigo <> ALL (select codigo from visita), que retorna verdadeiro quando o código do cliente é diferente de todos os códigos presentes na tabela visita – ou seja, quando o cliente não possui nenhuma visita registrada. É a única sintaxe correta para implementar a operação desejada.

A questão testa conhecimento de subconsultas correlacionadas e operadores de conjunto. O operador <> ALL equivale a "não igual a nenhum valor da subconsulta", que é exatamente a condição para clientes que nunca visitaram.

  1. 1Subconsulta: visita
  2. 2Operador: <> ALL
  3. 3Compara: codigo do cliente
  4. 4Resultado: só sem visita
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

A subconsulta where v.codigo in cliente.codigo é sintaticamente inválida. O operador IN exige uma lista ou subconsulta; a expressão cliente.codigo (coluna) não constitui uma lista. Mesmo que se interpretasse como v.codigo = cliente.codigo, a lógica estaria correta ("não existe visita com mesmo código"), mas a sintaxe errada invalida a alternativa.

Alternativa B — ❌ Incorreta

A condição v.codigo <> cliente.codigo na subconsulta sempre retornará linhas (pois existem visitas para outros clientes), fazendo com que not exists seja falso para todos os clientes. Dessa forma, nenhuma linha é deletada – nem mesmo os clientes que nunca visitaram.

Alternativa C — ❌ Incorreta

codigo in (select codigo from visita) seleciona clientes que TÊM pelo menos uma visita, ou seja, deleta exatamente os clientes que visitaram. O sentido é oposto ao desejado.

Alternativa D — ✅ Correta ⟵ GABARITO

codigo <> ALL (select codigo from visita) é a forma padrão em SQL para verificar se um valor é diferente de todos os valores de uma subconsulta. Retorna verdadeiro apenas quando o código do cliente não aparece em nenhuma linha da tabela visita, deletando corretamente os clientes que nunca visitaram.

Alternativa E — ❌ Incorreta

A subconsulta (select count(*) from visita v where v.codigo <> cliente.codigo) > 0 conta visitas com código diferente do cliente. Para qualquer cliente (mesmo os que nunca visitaram), haverá visitas com outros códigos, resultando sempre em contagem > 0. Portanto, todos os clientes seriam deletados.

Gabarito: letra D – única alternativa que deleta apenas os clientes sem visitas.

Link permanente: /questoes/fg047171