Domine os comandos fundamentais do SQL: crie tabelas, insira dados, consulte com filtros, combine tabelas com JOINs e agregue resultados.
O comando CREATE TABLE faz parte da DDL (Data Definition Language), o subconjunto do SQL responsavel por definir a estrutura do banco. Com ele voce cria tabelas, define colunas, tipos de dados e restricoes. E o primeiro passo antes de qualquer operacao com dados.
NUMERIC(10,2) = ate 10 digitos, 2 decimais.Ao criar uma tabela, voce define restricoes diretamente nas colunas: PRIMARY KEY identifica o registro, NOT NULL impede valores vazios, UNIQUE impede duplicatas, REFERENCES cria chave estrangeira e DEFAULT define um valor padrao.
CREATE TABLE cliente (
id SERIAL PRIMARY KEY,
nome TEXT NOT NULL,
email TEXT UNIQUE
);
CREATE TABLE pedido (
id SERIAL PRIMARY KEY,
cliente_id INT REFERENCES cliente(id),
total NUMERIC(10,2) NOT NULL,
criado_em TIMESTAMP DEFAULT NOW()
);
Depois de criar a estrutura, voce precisa popular as tabelas. O INSERT adiciona novos registros e o UPDATE modifica registros existentes. Juntos com DELETE, formam as operacoes CRUD (Create, Read, Update, Delete) - a base de qualquer aplicacao.
Um UPDATE sem clausula WHERE modifica todos os registros da tabela. Sempre inclua WHERE para limitar o escopo. Antes de executar um UPDATE, rode um SELECT com o mesmo WHERE para confirmar quais registros serao afetados.
-- Inserindo um registro
INSERT INTO cliente (nome, email)
VALUES ('Ana Silva', 'ana@example.com');
-- Inserindo multiplos registros de uma vez
INSERT INTO cliente (nome, email)
VALUES ('Carlos Lima', 'carlos@example.com'),
('Maria Santos', 'maria@example.com');
-- Atualizando um registro especifico
UPDATE cliente
SET email = 'ana.silva@example.com'
WHERE id = 1;
O SELECT e o comando mais usado do SQL. Ele le dados das tabelas e retorna resultados filtrados, ordenados e limitados conforme voce precisa. A clausula WHERE filtra quais linhas devem aparecer no resultado.
* para todas (evite em producao).=, !=, >, <, LIKE, IS NULL, IN.ASC (padrao) ou DESC.Combine condicoes com AND (ambas devem ser verdadeiras), OR (pelo menos uma verdadeira) e NOT (inverte a condicao). Use parenteses para controlar a precedencia quando misturar AND e OR.
-- Selecionar colunas especificas com filtro
SELECT nome, email
FROM cliente
WHERE email IS NOT NULL;
-- Filtrar, ordenar e limitar
SELECT *
FROM pedido
WHERE total > 100
ORDER BY criado_em DESC
LIMIT 10;
-- Combinando condicoes com AND e operadores
SELECT nome
FROM cliente
WHERE email LIKE '%example.com'
AND nome != 'Ana Silva';
No modelo relacional, dados ficam distribuidos em varias tabelas. O JOIN combina linhas de duas ou mais tabelas com base em uma condicao de relacionamento (geralmente chave estrangeira = chave primaria). E o que da poder real ao SQL.
Use aliases (apelidos) para tabelas: FROM cliente c permite referenciar como c.nome em vez de cliente.nome. Isso e especialmente util quando voce junta varias tabelas e as colunas tem nomes ambiguos.
-- INNER JOIN: clientes que TEM pedidos
SELECT c.nome, p.total, p.criado_em
FROM cliente c
INNER JOIN pedido p ON p.cliente_id = c.id
ORDER BY p.total DESC;
-- LEFT JOIN: TODOS os clientes, mesmo sem pedidos
-- COALESCE substitui NULL por 0
SELECT c.nome, COALESCE(SUM(p.total), 0) AS total_gasto
FROM cliente c
LEFT JOIN pedido p ON p.cliente_id = c.id
GROUP BY c.nome;
Funcoes de agregacao transformam muitas linhas em um unico resultado resumido. O GROUP BY agrupa linhas que compartilham um valor em comum, e as funcoes de agregacao operam sobre cada grupo. E assim que voce gera relatorios e estatisticas direto no SQL.
WHERE filtra linhas individuais antes do agrupamento. HAVING filtra grupos depois da agregacao. Exemplo: "mostre clientes que gastaram mais de R$500" usa HAVING, porque o total e calculado pelo SUM apos o GROUP BY.
-- Resumo por cliente: contagem, soma e media
SELECT cliente_id,
COUNT(*) AS num_pedidos,
SUM(total) AS total,
AVG(total) AS media
FROM pedido
GROUP BY cliente_id
HAVING SUM(total) > 500;
O DELETE remove registros permanentemente. E um comando poderoso e perigoso: sem WHERE, ele apaga tudo da tabela. Na pratica, muitas aplicacoes preferem o padrao soft delete, que marca o registro como removido em vez de apaga-lo de verdade.
DELETE FROM tabela WHERE ... Remove permanentemente. Use para dados temporarios ou quando a regulacao exige.deletado_em TIMESTAMP. Em vez de deletar, faca UPDATE marcando a data. Os dados continuam no banco para auditoria.-- SEGURO: sempre com WHERE
DELETE FROM pedido WHERE id = 5;
-- SOFT DELETE (recomendado)
-- Passo 1: adicione a coluna de controle
ALTER TABLE cliente ADD COLUMN deletado_em TIMESTAMP;
-- Passo 2: em vez de deletar, marque a data
UPDATE cliente SET deletado_em = NOW() WHERE id = 3;
-- Nas consultas, filtre os "deletados":
-- SELECT * FROM cliente WHERE deletado_em IS NULL;