SELECT
SELECT * FROM users; SELECT name, email FROM users; SELECT DISTINCT city FROM users; SELECT name AS full_name FROM users;
WHERE
Operadores de Comparação
= <> (!=)Igual / diferente
< > <= >=Operadores de comparação
AND OR NOTOperadores lógicos
IS NULL / IS NOT NULLVerificações de nulo
Correspondência de Padrão
SELECT * FROM users WHERE name LIKE 'A%'; -- % = quaisquer caracteres, _ = caractere único SELECT * FROM users WHERE age IN (20, 25, 30); SELECT * FROM users WHERE age BETWEEN 18 AND 30;
JOIN
Tipos de JOIN
INNER JOINLinhas correspondentes em ambas as tabelas
LEFT JOINTodas as linhas da esquerda + correspondentes da direita
RIGHT JOINTodas as linhas da direita + correspondentes da esquerda
FULL OUTER JOINTodas as linhas de ambas as tabelas
CROSS JOINProduto cartesiano de ambas as tabelas
Sintaxe do JOIN
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id; SELECT u.name, o.total FROM users u LEFT JOIN orders o ON u.id = o.user_id;
INSERT / UPDATE / DELETE
Inserir
INSERT INTO users (name, email) VALUES ('Alice', '[email protected]'); INSERT INTO users (name, email) VALUES ('Bob', '[email protected]'), ('Carol', '[email protected]');
Atualizar
UPDATE users SET email = '[email protected]' WHERE id = 1;
Apagar
DELETE FROM users WHERE id = 1; DELETE FROM users; -- apaga todas as linhas
CREATE TABLE
Sintaxe
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, age INTEGER DEFAULT 0, score REAL );
Tipos de Dados Comuns
INTEGERNúmeros inteiros
REALNúmeros de ponto flutuante
TEXTDados de string/texto
BLOBDados binários
BOOLEANTRUE / FALSE (armazenado como 0/1)
DATE / DATETIMEValores de data e timestamp
Restrições
PRIMARY KEYIdentificador único de linha
NOT NULLValor obrigatório
UNIQUESem valores duplicados
DEFAULT valValor padrão se omitido
CHECK (expr)Regra de validação personalizada
FOREIGN KEYReferência a outra tabela
Funções de Agregação
COUNT(*)Número de linhas
COUNT(col)Valores não nulos na coluna
SUM(col)Soma da coluna numérica
AVG(col)Média da coluna numérica
MIN(col)Valor mínimo
MAX(col)Valor máximo
Exemplo
SELECT COUNT(*) AS total, AVG(age) AS avg_age, MAX(score) AS top_score FROM users;
GROUP BY / HAVING
SELECT city, COUNT(*) AS num_users FROM users GROUP BY city; SELECT city, AVG(age) AS avg_age FROM users GROUP BY city HAVING AVG(age) > 25;

WHERE filtra linhas antes do agrupamento; HAVING filtra grupos após a agregação

ORDER BY / LIMIT
SELECT * FROM users ORDER BY name ASC; SELECT * FROM users ORDER BY age DESC; SELECT * FROM users ORDER BY city, name LIMIT 10 OFFSET 20; -- pula 20, pega 10
Subconsultas
Na Cláusula WHERE
SELECT name FROM users WHERE id IN ( SELECT user_id FROM orders WHERE total > 100 );
Como Tabela Derivada
SELECT city, avg_age FROM ( SELECT city, AVG(age) AS avg_age FROM users GROUP BY city ) WHERE avg_age > 30;
Índices
CREATE INDEX idx_name ON users(name); CREATE UNIQUE INDEX idx_email ON users(email); DROP INDEX idx_name;
Quando Indexar
Colunas em WHEREAcelera a filtragem
Colunas em JOIN ONAcelera pesquisas de JOIN
Colunas em ORDER BYAcelera a ordenação
Colunas de alta cardinalidadeMuitos valores únicos se beneficiam mais