Manipulação de Dados
Manipulação de Dados
Como gerenciar um armazém — receber mercadorias (INSERT), ajustar etiquetas de prateleiras (UPDATE), limpar produtos expirados (DELETE) e esvaziar todo o armazém (TRUNCATE) — as operações CRUD de banco de dados são o núcleo do gerenciamento diário de dados. Aprender a operar dados de forma segura é mais importante do que aprender as operações em si.
1. Conceitos Fundamentais
| Conceito | Descrição |
|---|---|
INSERT INTO |
Inserir novos dados em uma tabela, suporta inserção de linha única e múltiplas linhas |
UPDATE ... SET |
Modificar dados existentes em uma tabela, deve usar WHERE para limitar o escopo |
DELETE FROM |
Deletar linhas específicas de uma tabela, deve usar WHERE para limitar o escopo |
TRUNCATE TABLE |
Limpar rapidamente todos os dados de uma tabela, mais rápido que DELETE mas mais perigoso |
| Hábitos de operação segura | Antes de executar DELETE/UPDATE, use SELECT para confirmar o escopo afetado |
2. Sintaxe Básica
INSERT INTO — Inserir Dados
-- Inserir uma única linha (especificar colunas)
INSERT INTO nome_da_tabela (coluna1, coluna2, coluna3)
VALUES (valor1, valor2, valor3);
-- Inserir uma única linha (todas as colunas, na ordem de criação da tabela)
INSERT INTO nome_da_tabela
VALUES (valor1, valor2, valor3);
-- Inserir múltiplas linhas
INSERT INTO nome_da_tabela (coluna1, coluna2)
VALUES (valor1, valor2),
(valor3, valor4),
(valor5, valor6);
UPDATE — Atualizar Dados
-- Atualizar linhas específicas
UPDATE nome_da_tabela
SET coluna1 = novo_valor1, coluna2 = novo_valor2
WHERE condição;
-- Atualizar com expressões
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 1;
SELECT * FROM employees WHERE department_id = 1; para ver quantas linhas serão afetadas.
DELETE — Deletar Dados
-- Deletar linhas específicas
DELETE FROM nome_da_tabela
WHERE condição;
-- Deletar todas as linha por linha, mantém estrutura da tabela)
DELETE FROM nome_da_tabela;
TRUNCATE — Limpar Tabela
-- Limpar toda a tabela (mantém estrutura da tabela)
TRUNCATE TABLE nome_da_tabela;
DELETE FROM nome_da_tabela (SQLite não suporta a sintaxe TRUNCATE). No MySQL/PostgreSQL, TRUNCATE é muito mais rápido que DELETE porque não deleta linha por linha e reinicia o ID auto-incremento.
Comparação INSERT vs DELETE vs TRUNCATE
| Operação | Efeito | Pode Desfazer | Reinicia ID Auto-incremento | Velocidade |
|---|---|---|---|---|
INSERT |
Inserir novas linhas | ✅ | — | — |
DELETE |
Deletar linha por linha (pode usar WHERE) | ✅ | ❌ | Lenta |
TRUNCATE |
Limpar tabela inteira | ❌ | ✅ | Rápida |
3. Exemplos de Código
Exemplo: Inserir Dados de Funcionário e Departamento (Dificuldade ⭐)
Inserir dados iniciais nas tabelas departments e employees.
-- Inserir dados dos departamentos primeiro
INSERT INTO departments (name, location)
VALUES ('Engineering', 'New York'),
('Marketing', 'Los Angeles'),
('Finance', 'New York');
-- Depois inserir dados dos funcionários
INSERT INTO employees (name, department_id, salary, hire_date)
VALUES ('John', 1, 15000.00, '2023-01-15'),
('Jane', 1, 18000.00, '2022-06-01'),
('Bob', 2, 12000.00, '2023-03-20'),
('Alice', 3, 13000.00, '2021-11-10');
-- Verificar resultados da inserção
SELECT * FROM departments;
Saída:
id name location
-- ----------- ----------
1 Engineering New York
2 Marketing Los Angeles
3 Finance New York
Exemplo: Atualizar Salários de Funcionários de Forma Segura (Dificuldade ⭐⭐)
Dar um aumento de 10% a todos os funcionários do departamento de Engenharia. Confirme primeiro, depois execute.
-- Passo 1: Usar SELECT para confirmar o escopo afetado
SELECT name, salary
FROM employees
WHERE department_id = 1;
Antes da atualização:
name salary
------ --------
John 15000.00
Jane 18000.00
-- Passo 2: Executar a atualização após confirmação
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 1;
-- Passo 3: Verificar os resultados da atualização
SELECT name, salary
FROM employees
WHERE department_id = 1;
Após a atualização:
name salary
------ --------
John 16500.00
Jane 19800.00
Exemplo: Comparando Operações de Exclusão e Limpeza (Dificuldade ⭐⭐⭐)
Comparar as diferenças de comportamento entre DELETE e TRUNCATE.
-- Criar uma tabela de teste temporária
CREATE TABLE test_delete (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT
);
-- Inserir dados de teste
INSERT INTO test_delete (name) VALUES ('A'), ('B'), ('C');
-- Deletar uma linha específica usando DELETE
DELETE FROM test_delete WHERE name = 'B';
SELECT * FROM test_delete;
Saída:
id name
-- ----
1 A
3 C
-- Limpar dados restantes usando DELETE
DELETE FROM test_delete;
-- Inserir novos dados e observar o ID auto-incremento
INSERT INTO test_delete (name) VALUES ('D');
SELECT * FROM test_delete;
Saída (observe que o ID começa em 4; o ID auto-incremento não foi reiniciado):
id name
-- ----
4 D
TRUNCATE TABLE test_delete; para limpar a tabela, o ID reiniciará a partir do 1 ao inserir novos dados.
4. Cenários Comuns de Aplicação
Cenário 1: Importação de Dados em Lote
Importação em lote de uma tabela temporária ou fonte de dados externa:
-- Copiar funcionários de alto salário para uma tabela de backup
INSERT INTO employees_backup (name, department_id, salary, hire_date)
SELECT name, department_id, salary, hire_date
FROM employees
WHERE salary > 15000;
Cenário 2: Atualização Condicional em Lote
Ajustar dados sob condições específicas:
-- Dar aumento de 5% a funcionários contratados há mais de 3 anos
UPDATE employees
SET salary = salary * 1.05
WHERE hire_date < DATE('now', '-3 years');
❓ Perguntas Frequentes
P: Tanto DELETE quanto TRUNCATE podem limpar uma tabela. Qual devo usar? R: Se você precisa limpar toda a tabela e não se importa com o ID auto-incremento, use TRUNCATE (mais rápido). Se precisa deletar dados parciais ou quer preservar a capacidade de rollback, use DELETE. No desenvolvimento diário, DELETE é mais seguro; TRUNCATE é tipicamente usado apenas ao inicializar dados de teste.
P: E se eu esqueci a condição WHERE e atualizei toda a tabela? R: Se você ainda não fez commit da transação, faça ROLLBACK imediatamente. Se já fez commit, no MySQL você pode recuperar através de replay de binlog; no SQLite, a recuperação é muito difícil sem backup. Então sempre faça SELECT para confirmar antes de executar UPDATE/DELETE.
P: E se eu não quiser preencher certas colunas durante o INSERT? R: Simplesmente omita-as da lista de colunas do INSERT. Essas colunas usarão seus valores padrão (DEFAULT) ou NULL. Por exemplo,
INSERT INTO employees (name, salary) VALUES ('New Employee', 10000);— department_id e hire_date serão NULL.
P: SQLite suporta TRUNCATE? R: Não. No SQLite, use
DELETE FROM nome_da_tabela;como alternativa. O efeito é o mesmo, mas o ID auto-incremento não será reiniciado. Para reiniciar o ID auto-incremento, executeDELETE FROM sqlite_sequence WHERE name='nome_da_tabela';após a exclusão.
📖 Resumo
- INSERT INTO é usado para inserir dados; sempre especifique nomes de colunas; suporta inserção de múltiplas linhas de uma vez
- UPDATE SET é usado para atualizar dados; deve usar condição WHERE, caso contrário toda a tabela será atualizada
- DELETE FROM é usado para deletar dados; deve usar condição WHERE, caso contrário toda a tabela será deletada
- TRUNCATE TABLE é usado para limpar rapidamente uma tabela inteira; mais rápido que DELETE mas não pode ser desfeito
- Hábitos seguros: Antes de executar DELETE ou UPDATE, use SELECT para confirmar o escopo afetado
- SQLite não suporta TRUNCATE; use
DELETE FROM nome_da_tabelacomo alternativa
📝 Exercícios
Exercício 1 (⭐)
Insira os seguintes dados de produtos na tabela products e depois consulte para verificar:
| name | category | price | stock |
|---|---|---|---|
| iPhone 15 | Phone | 5999.00 | 100 |
| MacBook Pro | Computer | 12999.00 | 50 |
| AirPods Pro | Accessory | 1899.00 | 200 |
| iPad Air | Tablet | 4799.00 | 80 |
Exercício 2 (⭐⭐)
Complete as seguintes operações, escrevendo um SELECT para confirmar antes de cada etapa:
- Aumente o preço de todos os produtos com estoque abaixo de 100 em 5%
- Aumente o estoque de produtos da categoria "Accessory" em 50
- Delete produtos com preço abaixo de 2000
Exercício 3 (⭐⭐⭐)
Simule um processo de "descontinuação de produto":
- Copie produtos com estoque = 0 da tabela products para uma nova tabela products_offline (crie a tabela primeiro)
- Delete esses produtos sem estoque da tabela products
- Verifique que os dados em ambas as tabelas estão corretos



