Os comandos UPDATE e DELETE são irreversíveis e podem causar perda permanente de dados. Sempre faça backup antes de executar!
Para acompanhar todos os exemplos desta aula, execute o script abaixo no seu banco de dados:
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');
Sempre use WHERE para especificar quais registros modificar. UPDATE sem WHERE modifica TODOS os registros da tabela!
UPDATE nome_tabela
SET coluna1 = novo_valor, coluna2 = novo_valor
WHERE condição;
-- 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';
-- 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;
-- 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';
-- 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;
Sempre use WHERE para especificar quais registros remover. DELETE sem WHERE remove TODOS os registros da tabela!
DELETE FROM nome_tabela
WHERE condição;
-- Remover funcionário por ID
DELETE FROM funcionarios
WHERE id = 8;
-- Verificar se foi removido
SELECT * FROM funcionarios
WHERE id = 8;
-- Remover produtos com estoque zero
DELETE FROM produtos
WHERE estoque = 0;
-- Verificar produtos restantes
SELECT nome, estoque FROM produtos;
-- Remover vendas de 2022
DELETE FROM vendas
WHERE data_venda < '2023-01-01';
-- Verificar vendas restantes
SELECT COUNT(*) as total_vendas
FROM vendas;
-- 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;
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.
-- 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: 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;
SELECT COUNT(*) FROM tabela;SELECT * FROM tabela WHERE condição;SHOW WARNINGS; (MySQL)SELECT @@ROWCOUNT; (SQL Server)Antes de executar cada exercício, use SELECT para verificar quais registros serão afetados. Por exemplo: SELECT * FROM funcionarios WHERE departamento = 'Financeiro';
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;
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;
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;
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';
Teste seus conhecimentos sobre comandos UPDATE e DELETE com nosso quiz interativo!
Iniciar Quiz