Referência Rápida Compacta: Todos os Tipos de Campos e Comandos SQL
Parte 1 — Todos os Tipos de Campos SQL por Categoria
1. Textos e Caracteres (Strings Curtas e Longas)
6 tiposUso: Códigos de tamanho exato (UF, CPF, Hash, UUID).
Regra: Fixo no disco; mais rápido que VARCHAR quando o tamanho nunca muda.
Uso: Nomes, e-mails, títulos, URLs e textos curtos.
Regra: Grava só o que foi digitado + 1-2 bytes; aceita índice total e DEFAULT.
Uso: Legendas curtas até 255 bytes fora da linha.
Regra: Quase sem vantagem sobre VARCHAR(255) pois não aceita valor DEFAULT.
Uso: Descrições de produtos, comentários e resumos (até 64 KB).
Regra: Salvo fora da linha principal da tabela; exige tamanho de prefixo para índice.
Uso: Artigos de blog, páginas HTML, contratos e JSONs grandes (até 16 MB).
Regra: 256x maior que o TEXT comum; ideal para conteúdo rico de CMS.
Uso: Livros, dumps, logs massivos (até 4 GB).
Regra: Capacidade máxima; nunca faça SELECT * sem necessidade para não estourar a RAM do PHP.
2. Números Inteiros (Contagens, Quantidades e Códigos)
5 tiposUso: Guardar números inteiros muito pequenos cujo valor jamais passará de 255.
Regra: Gasta apenas 1 byte (8x menor que um BIGINT). Se marcar UNSIGNED, impede valores negativos como idade -5.
Uso: Guardar números inteiros pequenos/médios que passam de 255 mas não passam de 65 mil.
Regra: Economiza metade do espaço de um INT comum (2 bytes vs 4 bytes) mantendo folga até 65.535.
Uso: Faixa intermediária exclusiva do MySQL para contadores de até 16,7 milhões.
Regra: Se você migrar o banco para PostgreSQL no futuro, o Postgres não tem MEDIUMINT (terá que virar INTEGER de 4 bytes). Na dúvida, use INT.
Uso: O inteiro universal padrão de qualquer banco de dados relacional.
Regra: É 100% compatível com todos os bancos (MySQL, PostgreSQL, SQLite, SQL Server) e tem velocidade máxima no processador.
Uso: Números inteiros gigantescos, chaves primárias de alto volume e valores monetários armazenados em centavos.
Regra: Garante que a tabela nunca vai travar por falta de IDs disponíveis, ao custo de usar 8 bytes por coluna em vez de 4.
3. Números com Vírgula: Decimais Exatos vs Ponto Flutuante
3 tiposUso: Dinheiro (preços, saldos, descontos), taxas fiscais e pesos.
Regra: Cálculo exato na base 10: R$ 0,10 + R$ 0,20 é sempre R$ 0,30 sem erro binário.
Uso: Sensores, gráficos aproximados e telemetria leve.
Regra: 4 bytes aproximados (~7 dígitos); NUNCA use para dinheiro!
Uso: Cálculos científicos, engenharia, pontuação de algoritmos de recomendação e estatística.
Regra: Dobra a precisão do FLOAT (usando 8 bytes em vez de 4), evitando estouros em números muito grandes ou muito pequenos.
4. Datas, Horários e Auditoria de Tempo
5 tiposUso: Data de nascimento, feriados e vencimento de boleto (YYYY-MM-DD).
Regra: 3 bytes; guarda só o dia no calendário, ignorando hora e fuso horário.
Uso: Horário de expediente (08:00:00) ou duração de vídeo/tarefa.
Regra: 3 bytes; aceita horas acumuladas acima de 24h (ex: 120:30:00).
Uso: Agendamentos locais fixos, emissão de NF e histórico (1000 a 9999).
Regra: 5-8 bytes; grava a data/hora literal sem converter fuso horário e não expira em 2038.
Uso: Logs globais (created_at, updated_at) em sistemas multi-fuso.
Regra: 4 bytes; converte p/ UTC ao salvar, mas sofre com o limite de 19/01/2038.
Uso: Ano de fabricação de veículo, ano letivo ou safra (YYYY).
Regra: 1 byte apenas (contra 3 bytes do DATE ou 2 bytes do SMALLINT).
5. Booleanos, Listas de Opções (ENUM/SET) e Documentos JSON
5 tiposUso: Guardar respostas de Sim/Não, Ativo/Inativo, Ligado/Desligado.
Regra: Ocupa apenas 1 byte e torna os filtros no PHP super limpos. Dica: se além de saber SE foi feito você precisar saber QUANDO foi feito (ex: e-mail verificado), troque `email_verificado BOOLEAN` por `email_verificado_em TIMESTAMP NULL`!
Uso: Máscaras binárias de hardware (b0101).
Regra: Mais difícil de ler no PDO; prefira BOOLEAN para flags simples.
Uso: Status fechados que não mudam (pendente, pago, cancelado).
Regra: 1 byte no disco; valida no banco, mas exige ALTER TABLE para criar nova opção.
Uso: Múltiplas escolhas fixas na mesma coluna (dias: seg,qua,sex).
Regra: Ruim para filtrar/indexar individualmente; em 95% dos casos prefira tabela N:N.
Uso: Guardar arrays, objetos aninhados e atributos variáveis sem precisar criar dezenas de colunas vazias.
Regra: Se escolher `JSON` em vez de `TEXT`, o banco impede salvar um JSON com erro de sintaxe e permite consultar campos internos direto no SQL (`WHERE atributos->>"$.voltagem" = "220v"`). Mas nunca use JSON para guardar chaves estrangeiras!
6. Binários, Arquivos (BLOBs) e Coordenadas de Mapa (Geo)
4 tiposUso: Hashes binários puros (SHA-256 = 32B), chaves AES e UUID compactado (16B).
Regra: Compara byte a byte (case-sensitive) e economiza 50% de espaço vs hexadecimal.
Uso: Certificados digitais .pfx pequenos ou arquivos binários restritos.
Regra: Para fotos, vídeos e PDFs, salve no S3/Disco e guarde só o caminho VARCHAR no banco!
Uso: Guardar um ponto geográfico (Longitude e Latitude) para cálculos nativos de distância em mapas.
Regra: Se usar 2 colunas `DECIMAL(10,8)` e `DECIMAL(11,8)`, é muito mais simples de ler e gravar no PHP. Se usar `POINT`, você ganha o poder de criar um `SPATIAL INDEX` e usar `ST_Distance_Sphere()` no SQL!
Uso: Desenhar áreas fechadas no mapa (bairros, zonas de taxa de entrega, fazendas).
Regra: Permite que o próprio banco de dados responda se uma coordenada está dentro ou fora de um polígono desenhado no mapa.
Parte 2 — Todos os Comandos SQL (DDL, Chaves, DML, SELECT, JOINs, Funções e Transações)
1. DDL — Estrutura (Criar, Alterar e Excluir Tabelas/Bancos)
11 cmdsCREATE DATABASE loja CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Quando usar: Início do projeto antes de importar o SQL do DrawDB.
USE loja;
Quando usar: No terminal SQL ou scripts de migração.
CREATE TABLE usuarios (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(120) NOT NULL);
Quando usar: Gerado automaticamente pelo DrawDB em File > Export SQL.
ALTER TABLE usuarios ADD COLUMN telefone VARCHAR(20) NULL AFTER nome;
Quando usar: Evolução do sistema quando surge um novo campo.
ALTER TABLE usuarios MODIFY COLUMN nome VARCHAR(200) NOT NULL;
Quando usar: Quando um VARCHAR ficou pequeno ou precisa virar NOT NULL.
ALTER TABLE usuarios RENAME COLUMN telefone TO celular;
Quando usar: Padronização de nomenclatura.
ALTER TABLE usuarios DROP COLUMN telefone;
Quando usar: Remoção de campos obsoletos (cuidado: apaga os dados da coluna).
CREATE INDEX idx_usuarios_nome ON usuarios (nome);
Quando usar: Colunas muito pesquisadas que não são UNIQUE.
CREATE UNIQUE INDEX uk_usuarios_email ON usuarios (email);
Quando usar: E-mail, CPF, CNPJ, Slug, Código SKU.
TRUNCATE TABLE logs_acesso;
Quando usar: Limpar tabelas de teste ou temporárias (muito mais rápido que DELETE sem WHERE).
DROP TABLE IF EXISTS logs_antigos;
Quando usar: Descartar tabelas que não existem mais.
2. Constraints & Flags de Coluna (DrawDB → SQL)
10 cmdsid BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
Quando usar: Toda tabela deve ter 1 PK (geralmente id).
FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE RESTRICT ON UPDATE CASCADE
Quando usar: Relacionamentos 1:N, 1:1 e N:N desenhados no DrawDB.
FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE CASCADE
Quando usar: Itens de um pedido, endereços exclusivos de um usuário.
FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT
Quando usar: Impedir apagar cliente que já possui vendas/notas fiscais.
FOREIGN KEY (vendedor_id) REFERENCES vendedores(id) ON DELETE SET NULL
Quando usar: Manter histórico de vendas mesmo se o vendedor for removido.
nome VARCHAR(120) NOT NULL
Quando usar: Use como padrão na maioria das colunas obrigatórias.
cpf CHAR(11) NOT NULL UNIQUE
Quando usar: CPF, CNPJ, E-mail, UUID, Slug.
status ENUM('ativo','inativo') NOT NULL DEFAULT 'ativo'
Quando usar: Status inicial, flags booleanas (DEFAULT 1), datas (DEFAULT CURRENT_TIMESTAMP).
estoque INT UNSIGNED NOT NULL DEFAULT 0
Quando usar: IDs, quantidades, contadores, idades.
preco DECIMAL(10,2) NOT NULL CHECK (preco >= 0)
Quando usar: Garantir preços positivos, notas entre 0 e 10, datas válidas.
3. DML — Manipulação de Dados (Inserir, Atualizar e Excluir)
5 cmdsINSERT INTO usuarios (nome, email) VALUES ('Ana Silva', 'ana@email.com');
Quando usar: Cadastro de qualquer registro (no PHP use sempre ? ou :nome com PDO).
INSERT INTO tags (nome) VALUES ('PHP'), ('MySQL'), ('DrawDB');
Quando usar: Importação em lote (muito mais rápido que vários INSERTs separados).
INSERT INTO estoque (produto_id, qtd) VALUES (10, 5) ON DUPLICATE KEY UPDATE qtd = qtd + VALUES(qtd);
Quando usar: Sincronizar contadores, carrinhos de compra ou catálogos.
UPDATE usuarios SET nome = 'Ana Costa', ativo = 1 WHERE id = 42;
Quando usar: Edição de cadastro. ATENÇÃO: nunca esqueça o WHERE!
DELETE FROM usuarios WHERE id = 42;
Quando usar: Exclusão física de registro (ou prefira Soft Delete com deleted_at).
4. DQL — Consultas, Filtros e Ordenação (SELECT)
9 cmdsSELECT id, nome, email FROM usuarios;
Quando usar: Listagens, APIs e carregamento de dados no PHP.
SELECT DISTINCT uf FROM clientes;
Quando usar: Listar estados, categorias ou anos distintos.
SELECT id, nome FROM produtos WHERE ativo = 1 AND preco >= 50.00;
Quando usar: Qualquer busca condicional.
SELECT * FROM pedidos WHERE status IN ('pago', 'enviado');
Quando usar: Filtrar por múltiplos IDs ou múltiplos status.
SELECT * FROM vendas WHERE criado_em BETWEEN '2026-01-01 00:00:00' AND '2026-01-31 23:59:59';
Quando usar: Filtros de período de datas ou faixas de preço.
SELECT id, nome FROM clientes WHERE nome LIKE 'Marcos%';
Quando usar: Campos de busca por nome ou prefixo.
SELECT id, nome FROM usuarios WHERE deleted_at IS NULL;
Quando usar: Filtrar registros ativos no padrão Soft Delete.
SELECT id, nome, preco FROM produtos ORDER BY preco ASC, nome DESC;
Quando usar: Classificar tabelas, mais recentes primeiro (ORDER BY id DESC).
SELECT id, nome FROM produtos ORDER BY id DESC LIMIT 20 OFFSET 40;
Quando usar: Paginação de resultados (ex: página 3 com 20 itens por página).
5. JOINs — Cruzamento de Tabelas Relacionadas
5 cmdsSELECT p.id, u.nome FROM pedidos p INNER JOIN usuarios u ON u.id = p.usuario_id;
Quando usar: Listar pedidos com os dados obrigatórios do cliente.
SELECT u.nome, p.id AS pedido_id FROM usuarios u LEFT JOIN pedidos p ON p.usuario_id = u.id;
Quando usar: Listar todos os clientes, inclusive quem nunca comprou.
SELECT u.id, u.nome FROM usuarios u LEFT JOIN pedidos p ON p.usuario_id = u.id WHERE p.id IS NULL;
Quando usar: Descobrir clientes sem pedidos ou produtos nunca vendidos.
SELECT a.nome, c.titulo FROM alunos a JOIN matriculas m ON m.aluno_id = a.id JOIN cursos c ON c.id = m.curso_id;
Quando usar: Alunos ↔ Cursos, Produtos ↔ Categorias, Usuários ↔ Permissões.
SELECT nome, email FROM clientes UNION ALL SELECT nome, email FROM fornecedores;
Quando usar: Unificar relatórios de tabelas diferentes com as mesmas colunas.
6. Agregação, Agrupamento e Funções Essenciais
8 cmdsSELECT COUNT(*) AS total_pedidos, SUM(valor) AS faturamento, AVG(valor) AS ticket_medio FROM pedidos;
Quando usar: Dashboards financeiros, contadores e estatísticas.
SELECT MIN(preco) AS menor_preco, MAX(preco) AS maior_preco FROM produtos;
Quando usar: Faixas de preço, primeira e última data de compra.
SELECT status, COUNT(*) AS qtd FROM pedidos GROUP BY status;
Quando usar: Total de vendas por mês, pedidos por status, clientes por estado.
SELECT usuario_id, COUNT(*) AS compras FROM pedidos GROUP BY usuario_id HAVING compras >= 5;
Quando usar: Encontrar clientes VIP com mais de 5 compras ou categorias com faturamento > X.
SELECT nome, COALESCE(apelido, nome, 'Sem nome') AS exibicao FROM usuarios;
Quando usar: Evitar retornar NULL para o PHP em relatórios e somas (ex: COALESCE(SUM(valor), 0)).
SELECT nome, CASE WHEN estoque = 0 THEN 'Esgotado' WHEN estoque < 5 THEN 'Baixo' ELSE 'Normal' END AS situacao FROM produtos;
Quando usar: Classificar faixas, criar rótulos dinâmicos ou somas condicionais.
SELECT DATEDIFF(NOW(), criado_em) AS dias_cadastro FROM usuarios;
Quando usar: Calcular vencimentos, idade de registros e filtros de hoje.
SELECT id, atributos->>'$.cor' AS cor FROM produtos WHERE atributos->>'$.voltagem' = '220v';
Quando usar: Consultar propriedades dinâmicas salvas em campos JSON.
7. Transações (TCL), Diagnóstico e Performance
4 cmdsSTART TRANSACTION; UPDATE contas SET saldo = saldo - 100 WHERE id = 1; UPDATE contas SET saldo = saldo + 100 WHERE id = 2; COMMIT;
Quando usar: Pagamentos, baixa de estoque + criação de pedido (no PHP: $pdo->beginTransaction()).
EXPLAIN SELECT * FROM pedidos WHERE status = 'pago' AND usuario_id = 10;
Quando usar: Otimizar consultas lentas e descobrir qual índice falta criar.
SHOW CREATE TABLE pedidos;
Quando usar: Auditar a estrutura real de uma tabela no servidor.
DESCRIBE usuarios;
Quando usar: Conferência rápida da estrutura da tabela no terminal.
Nenhum comando ou tipo encontrado para esse filtro.
Tente buscar por termos como varchar, join, foreign key, alter ou group by.