Exercicios de revisado

1. Criar tabela

CREATE TABLE usuarios (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT,
idade INTEGER,
ativo INTEGER DEFAULT 1,
dtcad TEXT DEFAULT CURRENT_TIMESTAMP
);

No SQLite, os tipos mais usados são:

INTEGER
TEXT
REAL
BLOB
NUMERIC

2. Inserir dados

INSERT INTO usuarios (nome, email, idade)
VALUES ('Marcelo', 'marcelo@email.com', 45);

Inserir vários registros:

INSERT INTO usuarios (nome, email, idade)
VALUES
('João', 'joao@email.com', 30),
('Maria', 'maria@email.com', 25);

3. Consultar dados

SELECT * FROM usuarios;

Selecionar campos específicos:

SELECT id, nome, email
FROM usuarios;

Com filtro:

SELECT *
FROM usuarios
WHERE ativo = 1;

Com ordenação:

SELECT *
FROM usuarios
ORDER BY nome ASC;

Limitar resultados:

SELECT *
FROM usuarios
LIMIT 10;

4. Atualizar dados

UPDATE usuarios
SET nome = 'Marcelo Maurin',
email = 'novo@email.com'
WHERE id = 1;

Sempre use WHERE, senão atualiza todos os registros.


5. Excluir dados

DELETE FROM usuarios
WHERE id = 1;

Excluir todos os registros:

DELETE FROM usuarios;

6. Criar índice

CREATE INDEX idx_usuarios_nome
ON usuarios (nome);

Índice único:

CREATE UNIQUE INDEX idx_usuarios_email
ON usuarios (email);

7. Alterar tabela

Adicionar coluna:

ALTER TABLE usuarios
ADD COLUMN telefone TEXT;

Renomear tabela:

ALTER TABLE usuarios
RENAME TO pessoas;

Renomear coluna:

ALTER TABLE pessoas
RENAME COLUMN telefone TO celular;

8. Apagar tabela

DROP TABLE usuarios;

Apagar somente se existir:

DROP TABLE IF EXISTS usuarios;

9. Verificar tabelas existentes

SELECT name
FROM sqlite_master
WHERE type = 'table';

Ver estrutura da tabela:

PRAGMA table_info(usuarios);

10. Chave estrangeira

CREATE TABLE ordens_servico (
id INTEGER PRIMARY KEY AUTOINCREMENT,
id_usuario INTEGER NOT NULL,
descricao TEXT,
dtcad TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (id_usuario) REFERENCES usuarios(id)
);

Ativar suporte a chave estrangeira:

PRAGMA foreign_keys = ON;

11. JOIN entre tabelas

SELECT 
os.id,
os.descricao,
u.nome AS usuario
FROM ordens_servico os
LEFT JOIN usuarios u ON u.id = os.id_usuario;

12. Funções úteis

Contar registros:

SELECT COUNT(*) FROM usuarios;

Maior valor:

SELECT MAX(id) FROM usuarios;

Menor valor:

SELECT MIN(id) FROM usuarios;

Média:

SELECT AVG(idade) FROM usuarios;

Soma:

SELECT SUM(idade) FROM usuarios;

13. Agrupamento

SELECT ativo, COUNT(*) AS total
FROM usuarios
GROUP BY ativo;

Com filtro no agrupamento:

SELECT ativo, COUNT(*) AS total
FROM usuarios
GROUP BY ativo
HAVING COUNT(*) > 5;

14. Busca com LIKE

SELECT *
FROM usuarios
WHERE nome LIKE '%Marcelo%';

Começa com:

SELECT *
FROM usuarios
WHERE nome LIKE 'Mar%';

Termina com:

SELECT *
FROM usuarios
WHERE nome LIKE '%lo';

15. Datas no SQLite

Data atual:

SELECT date('now');

Data e hora atual:

SELECT datetime('now');

Data/hora local:

SELECT datetime('now', 'localtime');

Usando em tabela:

INSERT INTO usuarios (nome, dtcad)
VALUES ('Marcelo', datetime('now', 'localtime'));

16. Transação

BEGIN TRANSACTION;INSERT INTO usuarios (nome) VALUES ('Teste 1');
INSERT INTO usuarios (nome) VALUES ('Teste 2');COMMIT;

Cancelar:

ROLLBACK;

17. UPSERT

Insere ou atualiza se já existir:

INSERT INTO usuarios (id, nome, email)
VALUES (1, 'Marcelo', 'marcelo@email.com')
ON CONFLICT(id) DO UPDATE SET
nome = excluded.nome,
email = excluded.email;

18. Apagar dados e reiniciar AUTOINCREMENT

DELETE FROM usuarios;DELETE FROM sqlite_sequence
WHERE name = 'usuarios';

19. Ver SQL usado para criar tabela

SELECT sql
FROM sqlite_master
WHERE type = 'table'
AND name = 'usuarios';

20. Modelo básico para seus sistemas

CREATE TABLE exemplo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
descricao TEXT NOT NULL,
ativo INTEGER DEFAULT 1,
dtcad TEXT DEFAULT CURRENT_TIMESTAMP,
dtalt TEXT
);

Para alterar:

UPDATE exemplo
SET descricao = 'Nova descrição',
dtalt = datetime('now', 'localtime')
WHERE id = 1;

Esse é o conjunto principal que você mais vai usar no SQLite com Lazarus, PHP ou Python.