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
⚠️ Aviso Central: UPDATE e DELETE sem WHERE afetarão TODAS as linhas da tabela! Este é o erro catastrófico mais comum que iniciantes cometem.


2. Sintaxe Básica

INSERT INTO — Inserir Dados

SQL
-- 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);
💡 Dica: É fortemente recomendado especificar os nomes das colunas. Não dependa da ordem padrão das colunas. Se a estrutura da tabela mudar (ex: novas colunas são adicionadas), instruções INSERT sem nomes de colunas podem dar erro ou inserir dados incorretos.

UPDATE — Atualizar Dados

SQL
-- 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;
💡 Dica: Antes de executar UPDATE, use SELECT para confirmar quais linhas a condição WHERE corresponde. Por exemplo, primeiro execute SELECT * FROM employees WHERE department_id = 1; para ver quantas linhas serão afetadas.

DELETE — Deletar Dados

SQL
-- 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;
💡 Dica: Dados deletados podem ser recuperados através de rollback de transação (se dentro de uma transação), mas não podem ser recuperados após o commit. Crie o hábito: SELECT primeiro, depois DELETE.

TRUNCATE — Limpar Tabela

SQL
-- Limpar toda a tabela (mantém estrutura da tabela)
TRUNCATE TABLE nome_da_tabela;
💡 Dica: TRUNCATE no SQLite é equivalente a 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.

SQL
-- 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;
▶ Experimente

Saída:

TEXT
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.

SQL
-- Passo 1: Usar SELECT para confirmar o escopo afetado
SELECT name, salary
FROM employees
WHERE department_id = 1;
▶ Experimente

Antes da atualização:

TEXT
name    salary
------  --------
John    15000.00
Jane    18000.00
SQL
-- 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:

TEXT
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.

SQL
-- 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;
▶ Experimente

Saída:

TEXT
id  name
--  ----
1   A
3   C
SQL
-- 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):

TEXT
id  name
--  ----
4   D
💡 No MySQL, se você usar 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:

SQL
-- 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:

SQL
-- 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, execute DELETE FROM sqlite_sequence WHERE name='nome_da_tabela'; após a exclusão.


📖 Resumo


📝 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:

  1. Aumente o preço de todos os produtos com estoque abaixo de 100 em 5%
  2. Aumente o estoque de produtos da categoria "Accessory" em 50
  3. Delete produtos com preço abaixo de 2000

Exercício 3 (⭐⭐⭐)

Simule um processo de "descontinuação de produto":

  1. Copie produtos com estoque = 0 da tabela products para uma nova tabela products_offline (crie a tabela primeiro)
  2. Delete esses produtos sem estoque da tabela products
  3. Verifique que os dados em ambas as tabelas estão corretos

Próxima Lição

👉 05-data-types - Tipos de Dados

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%