Cheat Sheet SQL & DrawDB 28 Tipos • 52 Comandos

Referência Rápida Compacta: Todos os Tipos de Campos e Comandos SQL

Filtrar:

Parte 1 — Todos os Tipos de Campos SQL por Categoria

Ver comparativo completo A vs B vs C →

1. Textos e Caracteres (Strings Curtas e Longas)

6 tipos
DrawDB: CHAR | Size: n (1 a 255) • Fixo: n caracteres (1 a 255)

Uso: Códigos de tamanho exato (UF, CPF, Hash, UUID).

Regra: Fixo no disco; mais rápido que VARCHAR quando o tamanho nunca muda.

DrawDB: VARCHAR | Size: n (ex: 100, 150, 255) • Variável: tamanho do texto + 1 ou 2 bytes (até 16.383 chars em utf8mb4)

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.

DrawDB: TINYTEXT | Size: vazio • Até 255 bytes (~255 caracteres) + 1 byte de prefixo

Uso: Legendas curtas até 255 bytes fora da linha.

Regra: Quase sem vantagem sobre VARCHAR(255) pois não aceita valor DEFAULT.

DrawDB: TEXT | Size: vazio • Até 65.535 bytes (~64 KB — cerca de 15 a 30 páginas de texto)

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.

DrawDB: MEDIUMTEXT | Size: vazio • Até 16.777.215 bytes (~16 MB de texto)

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.

DrawDB: LONGTEXT | Size: vazio • Até 4.294.967.295 bytes (~4 GB de texto)

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 tipos
DrawDB: TINYINT | Flags: UN (se não aceitar negativo) • 1 Byte (8 bits) — De -128 a 127 (Signed) ou 0 a 255 (Unsigned)

Uso: 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.

DrawDB: SMALLINT | Flags: UN • 2 Bytes (16 bits) — De -32.768 a 32.767 (Signed) ou 0 a 65.535 (Unsigned)

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.

DrawDB: MEDIUMINT (Específico do MySQL/MariaDB) • 3 Bytes (24 bits) — De -8.388.608 a 8.388.607 ou 0 a 16.777.215 (Unsigned)

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.

DrawDB: INT (ou INTEGER) • 4 Bytes (32 bits) — De -2,14 bilhões a +2,14 bilhões (ou 0 a 4,29 bilhões Unsigned)

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.

DrawDB: BIGINT | Flags: UN • 8 Bytes (64 bits) — Até 9 quintilhões (Signed) ou 18,4 quintilhões (Unsigned)

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 tipos
DrawDB: DECIMAL | Size: M,D (ex: 10,2 ou 12,2) • ~4 Bytes a cada 9 dígitos (DECIMAL(10,2) ocupa 5 Bytes)

Uso: 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.

DrawDB: FLOAT | Size: vazio • 4 Bytes (Precisão simples ~7 dígitos)

Uso: Sensores, gráficos aproximados e telemetria leve.

Regra: 4 bytes aproximados (~7 dígitos); NUNCA use para dinheiro!

DrawDB: DOUBLE | Size: vazio • 8 Bytes (Precisão dupla ~15 a 17 dígitos)

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 tipos
DrawDB: DATE | Size: vazio • 3 Bytes — Formato ISO: YYYY-MM-DD (de 1000-01-01 a 9999-12-31)

Uso: 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.

DrawDB: TIME | Size: vazio • 3 Bytes — Formato: HH:MM:SS

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

DrawDB: DATETIME | Size: vazio • 5 a 8 Bytes — De 1000-01-01 00:00:00 a 9999-12-31 23:59:59

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.

DrawDB: TIMESTAMP | Default: CURRENT_TIMESTAMP • 4 Bytes (MySQL) / 8 Bytes (PostgreSQL TIMESTAMPTZ)

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.

DrawDB: YEAR (MySQL) ou SMALLINT • 1 Byte (Anos de 1901 a 2155)

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 tipos
DrawDB: BOOLEAN (ou TINYINT Size: 1) • 1 Byte — Valores: 0 (Falso) ou 1 (Verdadeiro)

Uso: 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`!

DrawDB: BIT | Size: 1 a 64 • Aproximadamente (n + 7) / 8 Bytes

Uso: Máscaras binárias de hardware (b0101).

Regra: Mais difícil de ler no PDO; prefira BOOLEAN para flags simples.

DrawDB: ENUM | Values: 'pendente','pago','cancelado' • 1 Byte (até 255 opções) ou 2 Bytes

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.

DrawDB: SET | Values: 'seg','ter','qua','qui','sex' • 1 a 8 Bytes (até 64 opções combináveis)

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.

DrawDB: JSON (ou JSONB no PostgreSQL) • Variável em formato binário otimizado (até 1 GB / 4 GB)

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 tipos
DrawDB: BINARY ou VARBINARY | Size: n (ex: 16, 32) • Fixo (BINARY) ou Variável (VARBINARY) em bytes puros

Uso: 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.

DrawDB: BLOB (ou MEDIUMBLOB / LONGBLOB) • TINYBLOB: 255 B | BLOB: 64 KB | MEDIUMBLOB: 16 MB | LONGBLOB: 4 GB

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!

DrawDB: POINT (ou 2 colunas DECIMAL 10,8 e 11,8) • 25 Bytes (Interno WKB + SRID)

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!

DrawDB: POLYGON ou GEOMETRY • Variável conforme o número de vértices do mapa

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)

Clique em "Copiar" para copiar o comando SQL completo

1. DDL — Estrutura (Criar, Alterar e Excluir Tabelas/Bancos)

11 cmds
CREATE DATABASE Cria um novo banco de dados com suporte completo a acentos e emojis (UTF-8 4 bytes).
CREATE DATABASE loja CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Quando usar: Início do projeto antes de importar o SQL do DrawDB.

USE Seleciona o banco de dados ativo para executar os próximos comandos.
USE loja;

Quando usar: No terminal SQL ou scripts de migração.

CREATE TABLE Cria uma nova tabela definindo suas colunas, tipos e chaves.
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 ADD Adiciona uma nova coluna em uma tabela que já existe sem perder dados.
ALTER TABLE usuarios ADD COLUMN telefone VARCHAR(20) NULL AFTER nome;

Quando usar: Evolução do sistema quando surge um novo campo.

ALTER TABLE MODIFY Altera o tipo ou tamanho de uma coluna existente.
ALTER TABLE usuarios MODIFY COLUMN nome VARCHAR(200) NOT NULL;

Quando usar: Quando um VARCHAR ficou pequeno ou precisa virar NOT NULL.

ALTER TABLE RENAME COLUMN Renomeia uma coluna mantendo os dados intactos (MySQL 8+ / PostgreSQL).
ALTER TABLE usuarios RENAME COLUMN telefone TO celular;

Quando usar: Padronização de nomenclatura.

ALTER TABLE DROP Remove permanentemente uma coluna e todos os dados dela.
ALTER TABLE usuarios DROP COLUMN telefone;

Quando usar: Remoção de campos obsoletos (cuidado: apaga os dados da coluna).

CREATE INDEX Cria um índice B-Tree para acelerar buscas (WHERE / ORDER BY) na coluna.
CREATE INDEX idx_usuarios_nome ON usuarios (nome);

Quando usar: Colunas muito pesquisadas que não são UNIQUE.

CREATE UNIQUE INDEX Cria índice único: impede valores duplicados e acelera buscas ao máximo.
CREATE UNIQUE INDEX uk_usuarios_email ON usuarios (email);

Quando usar: E-mail, CPF, CNPJ, Slug, Código SKU.

TRUNCATE TABLE Esvazia TODOS os registros da tabela rapidamente e zera o AUTO_INCREMENT.
TRUNCATE TABLE logs_acesso;

Quando usar: Limpar tabelas de teste ou temporárias (muito mais rápido que DELETE sem WHERE).

DROP TABLE Exclui a tabela inteira (estrutura + dados) do banco.
DROP TABLE IF EXISTS logs_antigos;

Quando usar: Descartar tabelas que não existem mais.

2. Constraints & Flags de Coluna (DrawDB → SQL)

10 cmds
PRIMARY KEY (PK) Identificador único obrigatório de cada linha. Cria índice clusterizado automático.
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY

Quando usar: Toda tabela deve ter 1 PK (geralmente id).

FOREIGN KEY (FK) Chave estrangeira: liga a tabela filha à tabela pai garantindo integridade referencial.
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.

ON DELETE CASCADE Se o registro pai for apagado, apaga automaticamente todos os registros filhos.
FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE CASCADE

Quando usar: Itens de um pedido, endereços exclusivos de um usuário.

ON DELETE RESTRICT Bloqueia a exclusão do pai se houver registros filhos vinculados.
FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT

Quando usar: Impedir apagar cliente que já possui vendas/notas fiscais.

ON DELETE SET NULL Se o pai for apagado, mantém o filho e define a coluna FK como NULL.
FOREIGN KEY (vendedor_id) REFERENCES vendedores(id) ON DELETE SET NULL

Quando usar: Manter histórico de vendas mesmo se o vendedor for removido.

NOT NULL (NN) Obriga que a coluna sempre receba um valor válido (proíbe NULL).
nome VARCHAR(120) NOT NULL

Quando usar: Use como padrão na maioria das colunas obrigatórias.

UNIQUE (UQ) Garante que nunca existam 2 linhas com o mesmo valor nesta coluna.
cpf CHAR(11) NOT NULL UNIQUE

Quando usar: CPF, CNPJ, E-mail, UUID, Slug.

DEFAULT Define um valor padrão caso o INSERT não informe essa coluna.
status ENUM('ativo','inativo') NOT NULL DEFAULT 'ativo'

Quando usar: Status inicial, flags booleanas (DEFAULT 1), datas (DEFAULT CURRENT_TIMESTAMP).

UNSIGNED (UN) Proíbe números negativos e dobra a capacidade positiva do inteiro.
estoque INT UNSIGNED NOT NULL DEFAULT 0

Quando usar: IDs, quantidades, contadores, idades.

CHECK Valida uma regra lógica antes de aceitar INSERT ou UPDATE (MySQL 8.0.16+).
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 cmds
INSERT INTO Insere uma nova linha na tabela especificando as colunas.
INSERT 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 (Múltiplo) Insere várias linhas de uma só vez em um único comando de rede.
INSERT INTO tags (nome) VALUES ('PHP'), ('MySQL'), ('DrawDB');

Quando usar: Importação em lote (muito mais rápido que vários INSERTs separados).

ON DUPLICATE KEY UPDATE Upsert: se a chave UNIQUE/PK ainda não existir, insere; se já existir, atualiza.
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 ... WHERE Atualiza colunas de registros existentes que atendem ao filtro WHERE.
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 ... WHERE Remove linhas específicas que atendem à condição do 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 cmds
SELECT ... FROM Busca apenas as colunas necessárias da tabela (evite SELECT * em produção).
SELECT id, nome, email FROM usuarios;

Quando usar: Listagens, APIs e carregamento de dados no PHP.

SELECT DISTINCT Retorna apenas valores únicos, eliminando linhas repetidas do resultado.
SELECT DISTINCT uf FROM clientes;

Quando usar: Listar estados, categorias ou anos distintos.

WHERE (=, !=, >, <) Filtra as linhas antes de retornar os dados.
SELECT id, nome FROM produtos WHERE ativo = 1 AND preco >= 50.00;

Quando usar: Qualquer busca condicional.

WHERE IN (...) Filtra registros cujo valor esteja dentro de uma lista (substitui vários OR).
SELECT * FROM pedidos WHERE status IN ('pago', 'enviado');

Quando usar: Filtrar por múltiplos IDs ou múltiplos status.

WHERE BETWEEN Filtra um intervalo inclusivo (inclui o início e o fim).
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.

WHERE LIKE Busca por padrão de texto. Dica: "termo%" usa índice; "%termo%" faz scan completo.
SELECT id, nome FROM clientes WHERE nome LIKE 'Marcos%';

Quando usar: Campos de busca por nome ou prefixo.

IS NULL / IS NOT NULL Testa se o campo é nulo ou preenchido (nunca use = NULL, use sempre IS NULL).
SELECT id, nome FROM usuarios WHERE deleted_at IS NULL;

Quando usar: Filtrar registros ativos no padrão Soft Delete.

ORDER BY Ordena o resultado de forma crescente (ASC) ou decrescente (DESC).
SELECT id, nome, preco FROM produtos ORDER BY preco ASC, nome DESC;

Quando usar: Classificar tabelas, mais recentes primeiro (ORDER BY id DESC).

LIMIT & OFFSET Limita a quantidade de linhas retornadas e pula N registros (paginação).
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 cmds
INNER JOIN Traz apenas as linhas que possuem correspondência nas DUAS tabelas.
SELECT 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.

LEFT JOIN Traz TODOS da tabela da esquerda (usuarios), mesmo que não tenham filhos na direita (pedidos).
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.

LEFT JOIN (Órfãos) Encontra registros da tabela A que NÃO possuem nenhum registro na tabela B.
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.

JOIN N:N (Tabela Pivô) Conecta duas tabelas através de uma tabela associativa (Muitos-para-Muitos).
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.

UNION / UNION ALL Empilha o resultado de dois SELECTs. UNION remove duplicados; UNION ALL é mais rápido e mantém tudo.
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 cmds
COUNT / SUM / AVG Conta linhas (COUNT), soma valores (SUM) e calcula média (AVG).
SELECT COUNT(*) AS total_pedidos, SUM(valor) AS faturamento, AVG(valor) AS ticket_medio FROM pedidos;

Quando usar: Dashboards financeiros, contadores e estatísticas.

MIN / MAX Retorna o menor e o maior valor encontrado na coluna.
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.

GROUP BY Agrupa linhas com o mesmo valor para calcular totais por grupo.
SELECT status, COUNT(*) AS qtd FROM pedidos GROUP BY status;

Quando usar: Total de vendas por mês, pedidos por status, clientes por estado.

HAVING Filtra os resultados DEPOIS do GROUP BY (WHERE filtra linhas antes; HAVING filtra grupos).
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.

COALESCE / IFNULL Retorna o primeiro valor não-nulo da lista (substitui NULL por um valor padrão na leitura).
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)).

CASE WHEN ... END Estrutura condicional (if/else) diretamente dentro da consulta SQL.
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.

NOW() / CURDATE() / DATEDIFF Funções de data/hora: NOW() retorna data+hora atual; CURDATE() apenas a data; DATEDIFF calcula diferença em dias.
SELECT DATEDIFF(NOW(), criado_em) AS dias_cadastro FROM usuarios;

Quando usar: Calcular vencimentos, idade de registros e filtros de hoje.

JSON_EXTRACT (ou ->>) Extrai uma chave de dentro de uma coluna JSON como texto limpo.
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 cmds
START TRANSACTION / COMMIT / ROLLBACK Executa vários comandos como um bloco atômico (Tudo ou Nada). Se algo falhar, ROLLBACK desfaz tudo.
START 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 Mostra o plano de execução da query: revela se o banco usou índice (key) ou leu a tabela toda (ALL).
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 Exibe o comando CREATE TABLE exato que está rodando no banco, incluindo todas as FKs e índices.
SHOW CREATE TABLE pedidos;

Quando usar: Auditar a estrutura real de uma tabela no servidor.

DESCRIBE (ou DESC) Lista rapidamente todas as colunas, tipos, nulabilidade, chaves e defaults de uma tabela.
DESCRIBE usuarios;

Quando usar: Conferência rápida da estrutura da tabela no terminal.