Guia completo de comandos SQL organizados por categoria para consulta rápida.
Comandos para definir e modificar a estrutura do banco de dados.
Cria uma nova tabela no banco de dados.
CREATE TABLE nome_tabela (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
idade INTEGER CHECK (idade >= 0),
created_at TIMESTAMP DEFAULT NOW()
);
Modifica a estrutura de uma tabela existente.
-- Adicionar coluna
ALTER TABLE nome_tabela ADD COLUMN nova_coluna VARCHAR(50);
-- Modificar coluna
ALTER TABLE nome_tabela ALTER COLUMN nome TYPE VARCHAR(150);
-- Remover coluna
ALTER TABLE nome_tabela DROP COLUMN coluna_antiga;
-- Adicionar restrição
ALTER TABLE nome_tabela ADD CONSTRAINT fk_usuario
FOREIGN KEY (usuario_id) REFERENCES usuarios(id);
Remove uma tabela do banco de dados.
-- Remover tabela
DROP TABLE nome_tabela;
-- Remover tabela se existir
DROP TABLE IF EXISTS nome_tabela;
Cria um índice para melhorar performance de consultas.
-- Índice simples
CREATE INDEX idx_nome ON usuarios(nome);
-- Índice composto
CREATE INDEX idx_nome_email ON usuarios(nome, email);
-- Índice único
CREATE UNIQUE INDEX idx_email_unico ON usuarios(email);
Comandos para manipular dados nas tabelas.
Insere novos registros na tabela.
-- Inserir um registro
INSERT INTO usuarios (nome, email, idade)
VALUES ('João Silva', 'joao@email.com', 30);
-- Inserir múltiplos registros
INSERT INTO usuarios (nome, email, idade) VALUES
('Maria Santos', 'maria@email.com', 25),
('Pedro Oliveira', 'pedro@email.com', 35);
-- Inserir com retorno
INSERT INTO usuarios (nome, email)
VALUES ('Ana Costa', 'ana@email.com')
RETURNING id, created_at;
Atualiza registros existentes na tabela.
-- Atualizar um campo
UPDATE usuarios SET idade = 31 WHERE id = 1;
-- Atualizar múltiplos campos
UPDATE usuarios
SET nome = 'João Santos', email = 'joao.santos@email.com'
WHERE id = 1;
-- Atualizar com condição
UPDATE usuarios SET idade = idade + 1
WHERE created_at < '2023-01-01';
Remove registros da tabela.
-- Deletar registro específico
DELETE FROM usuarios WHERE id = 1;
-- Deletar com condição
DELETE FROM usuarios WHERE idade < 18;
-- Deletar todos os registros (cuidado!)
DELETE FROM usuarios;
Comandos para consultar e recuperar dados.
Consultas básicas para recuperar dados.
-- Selecionar todas as colunas
SELECT * FROM usuarios;
-- Selecionar colunas específicas
SELECT nome, email FROM usuarios;
-- Selecionar com alias
SELECT nome AS "Nome Completo", email AS "E-mail" FROM usuarios;
-- Selecionar valores únicos
SELECT DISTINCT cidade FROM usuarios;
Filtrar registros com condições.
-- Condição simples
SELECT * FROM usuarios WHERE idade > 25;
-- Múltiplas condições
SELECT * FROM usuarios WHERE idade > 18 AND cidade = 'São Paulo';
-- Operadores de comparação
SELECT * FROM usuarios WHERE idade BETWEEN 20 AND 40;
SELECT * FROM usuarios WHERE nome LIKE 'João%';
SELECT * FROM usuarios WHERE cidade IN ('São Paulo', 'Rio de Janeiro');
SELECT * FROM usuarios WHERE email IS NOT NULL;
Ordenar resultados da consulta.
-- Ordenação crescente
SELECT * FROM usuarios ORDER BY nome;
-- Ordenação decrescente
SELECT * FROM usuarios ORDER BY idade DESC;
-- Múltiplas colunas
SELECT * FROM usuarios ORDER BY cidade, nome ASC;
Agrupar registros para agregações.
-- Contar por grupo
SELECT cidade, COUNT(*) as total_usuarios
FROM usuarios GROUP BY cidade;
-- Múltiplas agregações
SELECT cidade, COUNT(*) as total, AVG(idade) as idade_media
FROM usuarios GROUP BY cidade;
-- Filtrar grupos
SELECT cidade, COUNT(*) as total
FROM usuarios
GROUP BY cidade
HAVING COUNT(*) > 5;
Limitar número de registros retornados.
-- Primeiros 10 registros
SELECT * FROM usuarios LIMIT 10;
-- Paginação (pular 20, pegar 10)
SELECT * FROM usuarios LIMIT 10 OFFSET 20;
-- Com ordenação
SELECT * FROM usuarios ORDER BY created_at DESC LIMIT 5;
Comandos para combinar dados de múltiplas tabelas.
Retorna registros que têm correspondência em ambas as tabelas.
SELECT u.nome, p.titulo
FROM usuarios u
INNER JOIN pedidos p ON u.id = p.usuario_id;
Retorna todos os registros da tabela esquerda e correspondências da direita.
SELECT u.nome, p.titulo
FROM usuarios u
LEFT JOIN pedidos p ON u.id = p.usuario_id;
Retorna todos os registros da tabela direita e correspondências da esquerda.
SELECT u.nome, p.titulo
FROM usuarios u
RIGHT JOIN pedidos p ON u.id = p.usuario_id;
Retorna todos os registros de ambas as tabelas.
SELECT u.nome, p.titulo
FROM usuarios u
FULL OUTER JOIN pedidos p ON u.id = p.usuario_id;
Produto cartesiano entre duas tabelas.
SELECT u.nome, c.nome as categoria
FROM usuarios u
CROSS JOIN categorias c;
Funções built-in para manipulação e agregação de dados.
-- Contagem
SELECT COUNT(*) FROM usuarios;
SELECT COUNT(DISTINCT cidade) FROM usuarios;
-- Soma
SELECT SUM(valor) FROM pedidos;
-- Média
SELECT AVG(idade) FROM usuarios;
-- Máximo e Mínimo
SELECT MAX(valor), MIN(valor) FROM pedidos;
-- Concatenação
SELECT CONCAT(nome, ' - ', email) FROM usuarios;
-- Maiúscula/Minúscula
SELECT UPPER(nome), LOWER(email) FROM usuarios;
-- Substring
SELECT SUBSTRING(nome, 1, 3) FROM usuarios;
-- Comprimento
SELECT LENGTH(nome) FROM usuarios;
-- Trim
SELECT TRIM(nome) FROM usuarios;
-- Data atual
SELECT NOW(), CURRENT_DATE, CURRENT_TIME;
-- Extrair partes da data
SELECT EXTRACT(YEAR FROM created_at) FROM usuarios;
SELECT DATE_PART('month', created_at) FROM usuarios;
-- Formatação
SELECT TO_CHAR(created_at, 'DD/MM/YYYY') FROM usuarios;
-- Cálculos
SELECT AGE(NOW(), created_at) FROM usuarios;
-- Arredondamento
SELECT ROUND(valor, 2) FROM pedidos;
SELECT CEIL(valor), FLOOR(valor) FROM pedidos;
-- Valor absoluto
SELECT ABS(diferenca) FROM calculos;
-- Potência e raiz
SELECT POWER(base, 2), SQRT(numero) FROM calculos;
-- Aleatório
SELECT RANDOM();
Restrições para garantir integridade dos dados.
Identifica unicamente cada registro na tabela.
-- Na criação da tabela
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nome VARCHAR(100)
);
-- Adicionando depois
ALTER TABLE usuarios ADD CONSTRAINT pk_usuarios PRIMARY KEY (id);
Estabelece relacionamento entre tabelas.
-- Na criação da tabela
CREATE TABLE pedidos (
id SERIAL PRIMARY KEY,
usuario_id INTEGER REFERENCES usuarios(id)
);
-- Adicionando depois
ALTER TABLE pedidos
ADD CONSTRAINT fk_usuario
FOREIGN KEY (usuario_id) REFERENCES usuarios(id);
Garante que os valores sejam únicos.
-- Na criação da tabela
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
-- Adicionando depois
ALTER TABLE usuarios ADD CONSTRAINT uk_email UNIQUE (email);
Valida valores baseado em condições.
-- Na criação da tabela
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
idade INTEGER CHECK (idade >= 0 AND idade <= 120),
status VARCHAR(20) CHECK (status IN ('ativo', 'inativo'))
);
-- Adicionando depois
ALTER TABLE usuarios
ADD CONSTRAINT ck_idade CHECK (idade >= 0);
Impede valores nulos na coluna.
-- Na criação da tabela
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL
);
-- Modificando coluna existente
ALTER TABLE usuarios ALTER COLUMN nome SET NOT NULL;
-- Subquery no WHERE
SELECT * FROM usuarios
WHERE id IN (SELECT usuario_id FROM pedidos);
-- Subquery no SELECT
SELECT nome,
(SELECT COUNT(*) FROM pedidos WHERE usuario_id = u.id) as total_pedidos
FROM usuarios u;
-- Subquery correlacionada
SELECT * FROM usuarios u
WHERE EXISTS (SELECT 1 FROM pedidos p WHERE p.usuario_id = u.id);
-- ROW_NUMBER
SELECT nome, valor,
ROW_NUMBER() OVER (ORDER BY valor DESC) as ranking
FROM pedidos;
-- RANK e DENSE_RANK
SELECT nome, valor,
RANK() OVER (ORDER BY valor DESC) as rank,
DENSE_RANK() OVER (ORDER BY valor DESC) as dense_rank
FROM pedidos;
-- Particionamento
SELECT nome, categoria, valor,
AVG(valor) OVER (PARTITION BY categoria) as media_categoria
FROM produtos;
-- CTE simples
WITH usuarios_ativos AS (
SELECT * FROM usuarios WHERE status = 'ativo'
)
SELECT * FROM usuarios_ativos WHERE idade > 25;
-- CTE recursiva
WITH RECURSIVE hierarquia AS (
SELECT id, nome, gerente_id, 1 as nivel
FROM funcionarios WHERE gerente_id IS NULL
UNION ALL
SELECT f.id, f.nome, f.gerente_id, h.nivel + 1
FROM funcionarios f
JOIN hierarquia h ON f.gerente_id = h.id
)
SELECT * FROM hierarquia;
-- Criar view
CREATE VIEW usuarios_resumo AS
SELECT u.nome, u.email, COUNT(p.id) as total_pedidos
FROM usuarios u
LEFT JOIN pedidos p ON u.id = p.usuario_id
GROUP BY u.id, u.nome, u.email;
-- Usar view
SELECT * FROM usuarios_resumo WHERE total_pedidos > 5;
-- Remover view
DROP VIEW usuarios_resumo;
= - Igual!= ou <> - Diferente> - Maior que< - Menor que>= - Maior ou igual<= - Menor ou igualAND - E lógicoOR - OU lógicoNOT - NÃO lógicoIN - Está na listaBETWEEN - Entre valoresLIKE - Padrão de texto% - Zero ou mais caracteres_ - Exatamente um caractere[abc] - Qualquer caractere da lista[a-z] - Qualquer caractere do intervalo[^abc] - Qualquer caractere exceto da lista