⚠️ Semana 8 - Comandos UPDATE e DELETE com Segurança

Comandos de Modificação de Dados

Os comandos UPDATE e DELETE são irreversíveis e podem causar perda permanente de dados. Sempre faça backup antes de executar!

🗄️ Estrutura do Banco de Dados para Prática

Para acompanhar todos os exemplos desta aula, execute o script abaixo no seu banco de dados:

Script Completo de Criação

Execute este script no seu SGBD para criar a estrutura completa:

-- ============================================
-- SCRIPT COMPLETO PARA AULA DE UPDATE E DELETE
-- ============================================

-- 1. Criação da tabela FUNCIONARIOS
CREATE TABLE funcionarios (
    id INTEGER PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    cargo VARCHAR(50) NOT NULL,
    salario DECIMAL(10,2) NOT NULL,
    departamento VARCHAR(50) NOT NULL,
    data_admissao DATE NOT NULL,
    ativo BOOLEAN DEFAULT TRUE
);

-- 2. Criação da tabela PRODUTOS
CREATE TABLE produtos (
    id INTEGER PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    preco DECIMAL(10,2) NOT NULL,
    categoria VARCHAR(50) NOT NULL,
    estoque INTEGER NOT NULL,
    data_cadastro DATE NOT NULL,
    ativo BOOLEAN DEFAULT TRUE
);

-- 3. Criação da tabela VENDAS
CREATE TABLE vendas (
    id INTEGER PRIMARY KEY,
    produto_id INTEGER NOT NULL,
    funcionario_id INTEGER NOT NULL,
    quantidade INTEGER NOT NULL,
    valor_total DECIMAL(10,2) NOT NULL,
    data_venda DATE NOT NULL,
    FOREIGN KEY (produto_id) REFERENCES produtos(id),
    FOREIGN KEY (funcionario_id) REFERENCES funcionarios(id)
);

-- 4. Inserção de dados de exemplo
INSERT INTO funcionarios (nome, cargo, salario, departamento, data_admissao) VALUES
('João Silva', 'Vendedor', 2500.00, 'Vendas', '2023-01-15'),
('Maria Santos', 'Gerente', 4500.00, 'Vendas', '2022-03-10'),
('Pedro Costa', 'Analista', 3200.00, 'TI', '2023-06-20'),
('Ana Oliveira', 'Vendedor', 2500.00, 'Vendas', '2023-02-28'),
('Carlos Lima', 'Desenvolvedor', 3800.00, 'TI', '2022-11-05'),
('Lucia Ferreira', 'Gerente', 5000.00, 'TI', '2021-09-12'),
('Roberto Alves', 'Vendedor', 2500.00, 'Vendas', '2023-04-10'),
('Fernanda Rocha', 'Analista', 3000.00, 'Financeiro', '2023-01-20');

INSERT INTO produtos (nome, preco, categoria, estoque, data_cadastro) VALUES
('Notebook Dell', 2500.00, 'Informática', 15, '2023-01-10'),
('Mouse Logitech', 45.00, 'Informática', 50, '2023-01-15'),
('Teclado Mecânico', 120.00, 'Informática', 30, '2023-02-01'),
('Monitor LG', 800.00, 'Informática', 20, '2023-01-20'),
('Smartphone Samsung', 1200.00, 'Celulares', 25, '2023-03-05'),
('Tablet iPad', 2000.00, 'Tablets', 10, '2023-02-15'),
('Cadeira Gamer', 350.00, 'Móveis', 40, '2023-01-25'),
('Mesa Escritório', 200.00, 'Móveis', 15, '2023-02-10');

INSERT INTO vendas (produto_id, funcionario_id, quantidade, valor_total, data_venda) VALUES
(1, 1, 2, 5000.00, '2023-05-15'),
(2, 1, 5, 225.00, '2023-05-16'),
(3, 4, 3, 360.00, '2023-05-17'),
(4, 1, 1, 800.00, '2023-05-18'),
(5, 7, 2, 2400.00, '2023-05-19'),
(6, 4, 1, 2000.00, '2023-05-20'),
(7, 1, 4, 1400.00, '2023-05-21'),
(8, 7, 2, 400.00, '2023-05-22');
✏️ 1. Comando UPDATE - Modificando Dados
Cuidado com UPDATE!

Sempre use WHERE para especificar quais registros modificar. UPDATE sem WHERE modifica TODOS os registros da tabela!

📝 Sintaxe Básica do UPDATE:
UPDATE nome_tabela 
SET coluna1 = novo_valor, coluna2 = novo_valor
WHERE condição;
🎯 Exemplos Práticos:
Exemplo 1: Atualizar salário de um funcionário
-- Atualizar salário do João Silva
UPDATE funcionarios 
SET salario = 2800.00 
WHERE nome = 'João Silva';

-- Verificar a alteração
SELECT nome, salario 
FROM funcionarios 
WHERE nome = 'João Silva';
Exemplo 2: Atualizar múltiplas colunas
-- Promover funcionário
UPDATE funcionarios 
SET cargo = 'Supervisor', 
    salario = 3500.00,
    departamento = 'Vendas'
WHERE id = 1;

-- Verificar a alteração
SELECT * FROM funcionarios WHERE id = 1;
🔍 UPDATE com Condições Complexas:
Exemplo 3: Aumento salarial por departamento
-- Aumentar salário em 10% para TI
UPDATE funcionarios 
SET salario = salario * 1.10 
WHERE departamento = 'TI';

-- Verificar alterações
SELECT nome, departamento, salario 
FROM funcionarios 
WHERE departamento = 'TI';
Exemplo 4: Atualizar com subconsulta
-- Atualizar estoque baseado em vendas
UPDATE produtos 
SET estoque = estoque - (
    SELECT SUM(quantidade) 
    FROM vendas 
    WHERE produto_id = produtos.id
);

-- Verificar estoque atualizado
SELECT nome, estoque FROM produtos;
🗑️ 2. Comando DELETE - Removendo Dados
ATENÇÃO: DELETE é IRREVERSÍVEL!

Sempre use WHERE para especificar quais registros remover. DELETE sem WHERE remove TODOS os registros da tabela!

📝 Sintaxe Básica do DELETE:
DELETE FROM nome_tabela 
WHERE condição;
🎯 Exemplos Práticos:
Exemplo 1: Remover funcionário específico
-- Remover funcionário por ID
DELETE FROM funcionarios 
WHERE id = 8;

-- Verificar se foi removido
SELECT * FROM funcionarios 
WHERE id = 8;
Exemplo 2: Remover produtos sem estoque
-- Remover produtos com estoque zero
DELETE FROM produtos 
WHERE estoque = 0;

-- Verificar produtos restantes
SELECT nome, estoque FROM produtos;
🔍 DELETE com Condições Complexas:
Exemplo 3: Remover vendas antigas
-- Remover vendas de 2022
DELETE FROM vendas 
WHERE data_venda < '2023-01-01';

-- Verificar vendas restantes
SELECT COUNT(*) as total_vendas 
FROM vendas;
Exemplo 4: DELETE com JOIN
-- Remover vendas de produtos inativos
DELETE v FROM vendas v
JOIN produtos p ON v.produto_id = p.id
WHERE p.ativo = FALSE;

-- Verificar vendas restantes
SELECT COUNT(*) as vendas_ativas FROM vendas;
🛡️ 3. Boas Práticas de Segurança
✅ Práticas Recomendadas:
  • Sempre use WHERE - Especifique exatamente quais registros modificar
  • Faça backup antes de executar UPDATE/DELETE
  • Teste com SELECT primeiro para verificar os registros
  • Use transações para poder reverter alterações
  • Limite o acesso a usuários autorizados
❌ Práticas Perigosas:
  • UPDATE sem WHERE - Modifica todos os registros
  • DELETE sem WHERE - Remove todos os registros
  • Executar em produção sem teste
  • Ignorar relacionamentos (chaves estrangeiras)
  • Sem backup antes de alterações
🔄 4. Transações e Controle de Alterações
O que são Transações?

Transações permitem agrupar múltiplas operações em uma unidade atômica. Ou todas as operações são executadas com sucesso, ou nenhuma é executada.

📝 Sintaxe de Transações:
-- Iniciar transação
BEGIN TRANSACTION; -- ou START TRANSACTION;

-- Executar operações
UPDATE tabela1 SET coluna = valor WHERE condição;
DELETE FROM tabela2 WHERE condição;

-- Confirmar alterações
COMMIT;

-- OU reverter alterações
ROLLBACK;
🎯 Exemplo Prático de Transação:
-- Exemplo: Transferir funcionário entre departamentos
BEGIN TRANSACTION;

-- 1. Atualizar departamento do funcionário
UPDATE funcionarios 
SET departamento = 'Marketing' 
WHERE id = 3;

-- 2. Verificar se a operação foi bem-sucedida
SELECT * FROM funcionarios WHERE id = 3;

-- Se tudo estiver correto, confirmar
COMMIT;

-- Se houver problema, reverter
-- ROLLBACK;
🔍 Verificações Antes de COMMIT:
Verificações Recomendadas:
  • Quantos registros foram afetados?
  • Os dados estão corretos?
  • Há violações de integridade?
  • O resultado é o esperado?
Comandos de Verificação:
  • SELECT COUNT(*) FROM tabela;
  • SELECT * FROM tabela WHERE condição;
  • SHOW WARNINGS; (MySQL)
  • SELECT @@ROWCOUNT; (SQL Server)
💪 5. Exercícios Práticos
🎯 Exercício 1: Atualizações Simples
  1. Atualize o salário de todos os vendedores para R$ 2.800,00
  2. Mude o departamento de "Carlos Lima" para "Desenvolvimento"
  3. Aumente o preço de todos os produtos da categoria "Informática" em 5%
  4. Atualize o estoque do "Notebook Dell" para 20 unidades
🎯 Exercício 2: Remoções Controladas
  1. Remova todos os funcionários do departamento "Financeiro"
  2. Delete produtos com estoque menor que 10 unidades
  3. Remova vendas anteriores a 2023
  4. Delete funcionários que não têm vendas registradas
Dica de Segurança

Antes de executar cada exercício, use SELECT para verificar quais registros serão afetados. Por exemplo: SELECT * FROM funcionarios WHERE departamento = 'Financeiro';

🏢 6. Casos de Uso Reais
📊 Cenário 1: Sistema de RH

Situação: Funcionário foi promovido e transferido de departamento.

-- Verificar dados atuais
SELECT * FROM funcionarios WHERE id = 1;

-- Atualizar cargo e departamento
UPDATE funcionarios 
SET cargo = 'Supervisor',
    departamento = 'Vendas',
    salario = 3500.00
WHERE id = 1;

-- Verificar alteração
SELECT * FROM funcionarios WHERE id = 1;
🛒 Cenário 2: Sistema de E-commerce

Situação: Produto foi descontinuado e precisa ser removido.

-- Verificar se há vendas do produto
SELECT COUNT(*) FROM vendas 
WHERE produto_id = 1;

-- Se não houver vendas, remover produto
DELETE FROM produtos 
WHERE id = 1 AND 
      NOT EXISTS (SELECT 1 FROM vendas WHERE produto_id = 1);

-- Verificar se foi removido
SELECT * FROM produtos WHERE id = 1;
📈 Cenário 3: Análise de Performance

Situação: Remover dados antigos para melhorar performance.

-- Backup dos dados antigos (opcional)
CREATE TABLE vendas_backup AS 
SELECT * FROM vendas WHERE data_venda < '2023-01-01';

-- Remover dados antigos
DELETE FROM vendas 
WHERE data_venda < '2023-01-01';

-- Verificar quantos registros restaram
SELECT COUNT(*) FROM vendas;
🔄 Cenário 4: Correção de Dados

Situação: Corrigir dados incorretos em lote.

-- Verificar dados incorretos
SELECT * FROM funcionarios 
WHERE departamento = 'TI' AND cargo = 'Vendedor';

-- Corrigir cargo incorreto
UPDATE funcionarios 
SET cargo = 'Analista de TI'
WHERE departamento = 'TI' AND cargo = 'Vendedor';

-- Verificar correção
SELECT * FROM funcionarios WHERE departamento = 'TI';
📋 7. Resumo e Próximos Passos
✅ O que você aprendeu:
  • UPDATE: Modificar dados existentes com segurança
  • DELETE: Remover registros de forma controlada
  • Transações: Agrupar operações para controle
  • Boas práticas: Sempre usar WHERE e fazer backup
  • Verificações: Testar antes de confirmar alterações
🎯 Próximos passos:
  • Pratique com dados de teste
  • Aprenda sobre índices e performance
  • Estude relacionamentos entre tabelas
  • Explore comandos de backup e restore
  • Prepare-se para a Semana 9!
🎉 Parabéns! Você agora domina os comandos de modificação de dados em SQL. Lembre-se sempre de usar essas operações com responsabilidade e segurança!
🧠 Quiz Progressivo

Teste seus conhecimentos sobre comandos UPDATE e DELETE com nosso quiz interativo!

Iniciar Quiz