Define a estrutura do banco.
Comandos: CREATE, ALTER, DROP, TRUNCATE
Opera sobre tabelas, colunas, índices, constraints.
Manipula os dados dentro das tabelas.
Comandos: INSERT, UPDATE, DELETE
Opera sobre linhas. Pode ser revertido com ROLLBACK.
DDL muda o esquema; DML muda o conteúdo. Ambos precisam respeitar as constraints definidas.
-- Inserção simples (com nomes das colunas explícitos — boa prática) INSERT INTO cliente (cpf, nome, email) VALUES ('11111111111', 'Ana Silva', 'ana@email.com'); -- Inserção múltipla (todas as linhas numa só instrução) INSERT INTO produto (descricao, preco) VALUES ('Notebook', 3500.00), ('Mouse', 80.00), ('Teclado', 150.00); -- INSERT com SELECT (copiar linhas que atendem a um critério) INSERT INTO clientes_vip (cpf, nome) SELECT cpf, nome FROM cliente WHERE total_compras > 10000;
-- Atualizar um campo específico UPDATE produto SET preco = 3200.00 WHERE codigo = 1; -- Atualizar múltiplas colunas UPDATE cliente SET nome = 'Ana Costa', email = 'ana.costa@email.com' WHERE cpf = '11111111111'; -- Aumento de 10% em todos os produtos UPDATE produto SET preco = preco * 1.10;
CUIDADO: UPDATE sem WHERE atualiza todas as linhas da tabela!
-- Remover registro específico DELETE FROM cliente WHERE cpf = '11111111111'; -- Remover com condição composta DELETE FROM pedido WHERE data < '2025-01-01' AND status = 'cancelado'; -- SEM WHERE = apaga TUDO. Não há desfazer fora de uma transação. DELETE FROM produto;
DELETE: linha a linha, suporta WHERE, pode ser revertido com ROLLBACK.
TRUNCATE: remove tudo de uma vez, mais rápido, reseta sequências.
DELETE falha se houver FK apontando para a linha — a menos que a FK tenha ON DELETE CASCADE ou SET NULL.
Uma transação é um conjunto de operações executadas como unidade indivisível — ou todas acontecem, ou nenhuma.
BEGIN; -- inicia a transação UPDATE conta SET saldo = saldo - 500 WHERE id = 1; -- débito UPDATE conta SET saldo = saldo + 500 WHERE id = 2; -- crédito COMMIT; -- confirma as duas operações juntas -- ROLLBACK desfaz tudo o que foi feito desde o BEGIN
No PostgreSQL, cada comando fora de um BEGIN já é auto-confirmado (auto-commit). Para desfazer, você precisa usar BEGIN antes.
Discuta com um colega. Não existe resposta única — o objetivo é argumentar.
Uma empresa precisa remover dados de clientes inativos há 5 anos por obrigação legal (LGPD). Faz sentido usar DELETE ou há uma alternativa melhor? Como garantir que realmente foi removido?
Toda operação DML deveria estar dentro de uma transação? Ou existe custo nisso? Em que situações o overhead de BEGIN/COMMIT não vale a pena?
Cole o DDL da Aula 5 no DB Fiddle (PostgreSQL) e execute os passos abaixo em sequência.
Insira com INSERT múltiplo: 3 editoras, 4 autores, 6 livros, 4 membros e 5 empréstimos (2 já devolvidos, 3 em aberto).
Registre a devolução dos 3 empréstimos em aberto (UPDATE dt_devolucao). Corrija o ano de um livro inserido errado. Atualize o e-mail de um membro.
Tente deletar uma editora que possui livros — observe o erro de FK. Remova primeiro os livros dependentes e então delete a editora. Envolva tudo em BEGIN / COMMIT.