Referência SQL

Guia completo de comandos SQL organizados por categoria para consulta rápida.

Navegação Rápida

DDL - Data Definition Language

Comandos para definir e modificar a estrutura do banco de dados.

CREATE TABLE

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()
);

ALTER TABLE

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);

DROP TABLE

Remove uma tabela do banco de dados.

-- Remover tabela
DROP TABLE nome_tabela;

-- Remover tabela se existir
DROP TABLE IF EXISTS nome_tabela;

CREATE INDEX

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);

DML - Data Manipulation Language

Comandos para manipular dados nas tabelas.

INSERT

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;

UPDATE

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';

DELETE

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;

DQL - Data Query Language

Comandos para consultar e recuperar dados.

SELECT Básico

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;

WHERE - Filtros

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;

ORDER BY - Ordenação

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;

GROUP BY - Agrupamento

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;

LIMIT - Paginação

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;

JOINs - Relacionamentos

Comandos para combinar dados de múltiplas tabelas.

INNER JOIN

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;

LEFT JOIN

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;

RIGHT JOIN

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;

FULL OUTER JOIN

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;

CROSS JOIN

Produto cartesiano entre duas tabelas.

SELECT u.nome, c.nome as categoria 
FROM usuarios u 
CROSS JOIN categorias c;

Funções SQL

Funções built-in para manipulação e agregação de dados.

Funções de Agregação

-- 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;

Funções de String

-- 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;

Funções de Data

-- 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;

Funções Matemáticas

-- 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 (Constraints)

Restrições para garantir integridade dos dados.

PRIMARY KEY

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);

FOREIGN KEY

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);

UNIQUE

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);

CHECK

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);

NOT NULL

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;

Tópicos Avançados

Subqueries

-- 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);

Window Functions

-- 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;

CTEs (Common Table Expressions)

-- 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;

Views

-- 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;

Cartão de Referência Rápida

Operadores de Comparação

  • = - Igual
  • != ou <> - Diferente
  • > - Maior que
  • < - Menor que
  • >= - Maior ou igual
  • <= - Menor ou igual

Operadores Lógicos

  • AND - E lógico
  • OR - OU lógico
  • NOT - NÃO lógico
  • IN - Está na lista
  • BETWEEN - Entre valores
  • LIKE - Padrão de texto

Wildcards

  • % - Zero ou mais caracteres
  • _ - Exatamente um caractere
  • [abc] - Qualquer caractere da lista
  • [a-z] - Qualquer caractere do intervalo
  • [^abc] - Qualquer caractere exceto da lista