Questão de Banco de Dados — SQL — COPESE - UFJF 2017
Banco de Dados›SQL
Código
qq249226
Banca
COPESE - UFJF
Órgão
UFJF
Ano
2017
Nível
Médio
Cargo
COPESE - - Técnico de Tecnologia da Informação
Considere as duas tabelas em um banco de dados a seguir:Qual das instruções abaixo remove da tabela a linha com o funcionário com salário superior a 1000?
ADELETE FROM Funcionarios WHERE Cargos.Salario> 1000;
BDELETE FROM Funcionarios, cargos WHERE Cargos.Salario> 1000;
CDELETE FROM Funcionarios WHERE IdCargo IN (SELECT IdCargo FROM Cargos WHERE Salario > 1000);
DDELETE FROM Funcionarios WHERE IdCargo = SELECT IdCargo FROM Cargos WHERE Salario > 1000;
EDELETE FROM Funcionarios WHERE IdCargo = 2;
Revelar gabarito e comentário▾
GabaritoC — DELETE FROM Funcionarios WHERE IdCargo IN (SELECT IdCargo FROM Cargos WHERE Salario > 1000);
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 DELETE com subconsulta
A questão testa o conhecimento de sintaxe SQL para remover linhas de uma tabela com base em condição que envolve outra tabela. A tabela Funcionarios possui uma chave estrangeira IdCargo que referencia a tabela Cargos. O objetivo é deletar o(s) funcionário(s) cujo cargo tenha salário superior a 1000. Pela figura, os cargos com salário > 1000 são: Vendedor (IdCargo=2, salário 2000) e Estoquista (IdCargo=3, salário 3000). O funcionário com IdCargo=2 é José (CPF 8888888888). Portanto, a instrução deve remover a linha de José.
DELETE FROM Funcionarios
1WHERE IdCargo IN?
Subconsulta: SELECT IdCargo FROM Cargos WHERE Salario > 1000
Retorna IdCargo = 2 e 3
Funcionario com IdCargo = 2 é removido
Funcionario com IdCargo = 3 não existe
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
A sintaxe DELETE FROM Funcionarios WHERE Cargos.Salario > 1000 é inválida. A cláusula WHERE não pode referenciar diretamente colunas de outra tabela sem uma junção. Além disso, não há cláusula FROM para a tabela Cargos. Isso geraria erro de execução.
Alternativa B — ❌ Incorreta
DELETE FROM Funcionarios, cargos WHERE Cargos.Salario > 1000 tenta usar uma sintaxe de junção implícita (vírgula) no FROM, mas o comando DELETE no padrão SQL não permite múltiplas tabelas no FROM dessa forma (a menos que seja um DELETE com JOIN em alguns SGBDs, mas a sintaxe padrão é diferente). Além disso, a condição não relaciona as tabelas (falta WHERE Funcionarios.IdCargo = Cargos.IdCargo), o que causaria um produto cartesiano e deletaria todas as linhas de Funcionarios se a condição fosse verdadeira para algum cargo. Portanto, está incorreta.
Alternativa C — ✅ Correta
A instrução DELETE FROM Funcionarios WHERE IdCargo IN (SELECT IdCargo FROM Cargos WHERE Salario > 1000) é a forma correta. A subconsulta retorna os IdCargo dos cargos com salário > 1000 (2 e 3). O operador IN verifica se o IdCargo do funcionário está nesse conjunto. Assim, apenas o funcionário com IdCargo=2 (José) é removido (não há funcionário com IdCargo=3). A sintaxe está de acordo com o padrão SQL.
Alternativa D — ❌ Incorreta
DELETE FROM Funcionarios WHERE IdCargo = SELECT IdCargo FROM Cargos WHERE Salario > 1000 falta parênteses ao redor da subconsulta. O correto é = (SELECT ...). Sem os parênteses, a consulta é inválida e gera erro de sintaxe.
Alternativa E — ❌ Incorreta
DELETE FROM Funcionarios WHERE IdCargo = 2 remove o funcionário com IdCargo igual a 2 (José), mas não considera a condição de salário superior a 1000. A instrução é fixa e não atende ao requisito de remover baseado no salário. Além disso, se houvesse outros cargos com salário > 1000 (como IdCargo=3), eles não seriam removidos. Portanto, está incorreta.
PEGA ESSA DICA!
Em SQL, para deletar linhas de uma tabela com base em condição de outra, use subconsulta com IN ou EXISTS. Lembre-se de que subconsultas devem estar entre parênteses. A sintaxe DELETE FROM tabela1, tabela2 não é padrão para deleção de uma única tabela.