Pular para o conteúdo principal

Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2024

Banco de DadosSQL
Código
ce178298
Banca
CESPE / CEBRASPE
Órgão
MPO
Ano
2024
Nível
Superior
Cargo
Analista de Planejamento e Orçamento - Especialidade: Gestão de Infraestrutura de TI
Considerando a linguagem SQL, julgue o item subsequente.Considere que, em certa loja, os pedidos realizados por vendedores sejam salvos em uma tabela SQL pedidos, que as informações dos vendedores dessa loja sejam registradas na tabela vendedores e que cada um desses vendedores possua um código que é salvo na variável codigo_vendedor. Nessa situação hipotética, a execução do comando a seguir permitirá apagar todos os registros de pedidos realizados por vendedores-fantasmas (operação caça-fantasma).Imagem da questão
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

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

SQL – Comando DELETE com subconsulta correlacionada

Gabarito: Certo. O comando DELETE FROM pedidos WHERE codigo_vendedor NOT IN (SELECT codigo FROM vendedores); apaga todos os registros da tabela pedidos cujo codigo_vendedor não exista na tabela vendedores — exatamente os pedidos de vendedores-fantasmas. A operação é válida em SQL padrão e atende ao que o enunciado descreve.

O comando DELETE é a instrução da sublinguagem DML (Data Manipulation Language) responsável por remover registros de uma tabela. Sua sintaxe básica é DELETE FROM nome_da_tabela WHERE condição;. Quando a condição é omitida, todos os registros da tabela são apagados; quando presente, apenas os registros que satisfazem a condição são removidos.

No caso da questão, a condição é codigo_vendedor NOT IN (SELECT codigo FROM vendedores). Essa subconsulta retorna a lista de todos os códigos de vendedores que existem na tabela vendedores. O operador NOT IN seleciona os registros de pedidos cujo codigo_vendedor não está nessa lista. Ou seja, pedidos cujo vendedor não existe mais no cadastro — os chamados "vendedores-fantasmas".

A operação é conhecida como "caça-fantasma" justamente por identificar e eliminar registros órfãos, ou seja, registros que referenciam entidades que não existem mais. É uma técnica comum de limpeza de dados (data cleaning).

É importante notar que o comando funciona corretamente porque a subconsulta é independente da consulta externa — ela não depende de valores da linha atual de pedidos. Isso a caracteriza como uma subconsulta não correlacionada, que é executada uma única vez e retorna um conjunto fixo de valores.

Uma pegadinha comum nesse tipo de questão é confundir o operador NOT IN com NOT EXISTS. Ambos podem ser usados para o mesmo fim, mas têm comportamentos diferentes em relação a valores NULL. Se a subconsulta retornar algum NULL, o NOT IN não retornará nenhum registro (porque NULL não pode ser comparado), enquanto NOT EXISTS funcionaria corretamente. No entanto, como a coluna codigo da tabela vendedores é uma chave primária (ou pelo menos não nula), o NOT IN é seguro e correto.

Outra pegadinha é pensar que o comando apagaria também os vendedores da tabela vendedores. Isso não ocorre, pois o DELETE atua apenas sobre a tabela especificada após o FROM — no caso, pedidos. A tabela vendedores é apenas consultada pela subconsulta, não modificada.

Portanto, a execução do comando atende exatamente ao objetivo descrito: apagar todos os registros de pedidos realizados por vendedores que não existem mais na tabela vendedores.

Critério

NOT IN (usado no comando)

NOT EXISTS (alternativa)

Comportamento com NULL na subconsulta

Retorna nenhuma linha se houver qualquer NULL

Funciona corretamente, ignora NULLs

Uso com chave primária (codigo)

Seguro e correto

Também correto

Subconsulta correlacionada?

Não (executa uma vez)

Sim (avalia por linha)

Efeito sobre tabela vendedores

Nenhum (apenas consulta)

Nenhum (apenas consulta)

Resultado para vendedores-fantasmas

Remove pedidos órfãos

Remove pedidos órfãos

Item — ✅ CERTO

O comando DELETE FROM pedidos WHERE codigo_vendedor NOT IN (SELECT codigo FROM vendedores); é sintaticamente válido e semanticamente correto para a operação descrita. Ele remove todos os registros de pedidos cujo codigo_vendedor não consta na tabela vendedores, ou seja, os pedidos de vendedores-fantasmas. A subconsulta (SELECT codigo FROM vendedores) retorna a lista de vendedores existentes, e o NOT IN seleciona os pedidos que não pertencem a essa lista. Não há erro de sintaxe nem de lógica.

PEGA ESSA DICA!

Para questões de SQL, identifique primeiro a sublinguagem do comando (DDL, DML, DCL, DTL, DQL) e depois analise a cláusula WHERE. Em comandos DELETE com subconsulta, verifique se a subconsulta é correlacionada ou não, e se o operador usado (IN, NOT IN, EXISTS, NOT EXISTS) é adequado ao contexto, especialmente em relação a valores NULL.

Gabarito: Certo.

Link permanente: /questoes/ce178298