Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2024
- 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

- CCerto
- EErrado

GabaritoC — Certo
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 |
|
|
|---|---|---|
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 |
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.
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