Este guia apresenta a sintaxe fundamental do MySQL, organizada por categorias de operações com foco em clareza, eficiência e boas práticas de modelagem e consulta.
Comentários e Ordem de Execução
-- Comentário de uma linha/* Comentário de múltiplas linhas */# Comentário estilo shell
A ordem lógica de processamento de uma consulta SELECT é:
FROM → JOIN → ON → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMITDefinição de Estrutura — DDL
Gerenciamento de Bancos de Dados
SHOW DATABASES;
USE sistema_academico;
SELECT DATABASE();
CREATE DATABASE IF NOT EXISTS sistema_academico
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER DATABASE sistema_academico
CHARACTER SET utf8mb4;
DROP DATABASE IF EXISTS sistema_academico;
Criação e Modificação de Tabelas
-- Criação com restrições explícitas
CREATE TABLE IF NOT EXISTS alunos (
matricula CHAR(12) PRIMARY KEY,
nome VARCHAR(60) NOT NULL,
genero ENUM('M', 'F', 'O') DEFAULT 'O',
data_nascimento DATE,
criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB CHARSET=utf8mb4;
-- Cópia estrutural (sem dados)
CREATE TABLE alunos_backup LIKE alunos;
-- Cópia estrutural + dados
CREATE TABLE alunos_historico AS
SELECT * FROM alunos WHERE ativo = 1;
Para alterações incrementais em tabelas, utilize ALTER TABLE:
ADD COLUMN email VARCHAR(100) AFTER nomeCHANGE COLUMN genero sexo ENUM('M','F','O')MODIFY COLUMN nome VARCHAR(80) NOT NULLDROP COLUMN data_nascimentoRENAME TO estudantes
Manipulação de Dados — DML
Inserção
-- Inserção múltipla com valores explícitos
INSERT INTO alunos (matricula, nome, sexo) VALUES
('2023001', 'Ana Silva', 'F'),
('2023002', 'Bruno Costa', 'M');
-- Inserção via subconsulta
INSERT INTO alunos_arquivados
SELECT * FROM alunos WHERE ano_ingresso < 2020;
Atualização e Exclusão
-- Atualização condicional com limite
UPDATE professores
SET salario = salario * 1.05
WHERE departamento = 'Computação'
ORDER BY data_admissao
LIMIT 3;
-- Exclusão segura com filtro
DELETE FROM log_acessos
WHERE data_hora < DATE_SUB(NOW(), INTERVAL 90 DAY);
-- Limpeza completa com redefinição de autoincremento
TRUNCATE TABLE temp_relatorios;
Consultas Avançadas — DQL
Sintaxe Básica com Cláusulas-Chave
SELECT DISTINCT
a.matricula AS id_aluno,
CONCAT(a.nome, ' ', a.sobrenome) AS nome_completo,
COUNT(d.id) AS qtd_disciplinas
FROM alunos a
LEFT JOIN matriculas m ON a.matricula = m.aluno_id
LEFT JOIN disciplinas d ON m.disciplina_id = d.codigo
WHERE a.status = 'ATIVO'
GROUP BY a.matricula, a.nome, a.sobrenome
HAVING COUNT(d.id) > 2
ORDER BY qtd_disciplinas DESC, nome_completo ASC
LIMIT 0, 25;
Filtragem e Correspondência de Padrões
WHERE curso_id IN (101, 105, 109)WHERE nome LIKE 'Jo%o' AND email IS NOT NULLWHERE data_conclusao BETWEEN '2022-01-01' AND '2023-12-31'
Funções Condicionais
-- Avaliação binária
SELECT nome,
IF(ativo = 1, 'Ativo', 'Inativo') AS situacao
FROM alunos;
-- Mapeamento categórico
SELECT nome,
CASE nivel
WHEN 1 THEN 'Iniciante'
WHEN 2 THEN 'Intermediário'
WHEN 3 THEN 'Avançado'
ELSE 'Não classificado'
END AS categoria
FROM treinamentos;
Junções e Subconsultas
Tipos de Junção
- INNER JOIN: Retorna apenas registros com corrrespondência em ambas as tabelas.
- LEFT JOIN: Mantém todos os registros da tabela à esquerda, preenchendo com
NULLcampos ausentes da direita. - RIGHT JOIN: Análogo ao anterior, mas priorizando a tabela à direita.
- Self-Join: Útil para hierarquias (ex: gester/subordinado).
Subconsultas
-- Subconsulta escalar (único valor)
SELECT nome, salario
FROM funcionarios
WHERE salario > (SELECT AVG(salario) FROM funcionarios);
-- Subconsulta de colunas múltiplas
SELECT * FROM produtos
WHERE (categoria_id, status) IN (
SELECT categoria_id, 'ATIVO'
FROM categorias
WHERE ativo = 1
);
-- Subconsulta como tabela derivada
SELECT p.nome, c.nome_categoria
FROM (SELECT * FROM produtos WHERE preco > 100) p
JOIN categorias c ON p.categoria_id = c.id;
Transações e Controle de Concorrência
START TRANSACTION;
UPDATE contas SET saldo = saldo - 500 WHERE numero = 'ACC-789';
UPDATE contas SET saldo = saldo + 500 WHERE numero = 'ACC-123';
-- Validação lógica antes do commit
SELECT SUM(saldo) FROM contas WHERE numero IN ('ACC-789', 'ACC-123');
COMMIT;
-- Ou, em caso de falha:
-- ROLLBACK;
Otimização com Índices
Índices aceleram consultas de leitura, mas impactam operações de escrita. Estruturas comuns incluem B+Tree (padrão no InnoDB).
-- Criação de índice composto para consultas frequentes
CREATE INDEX idx_aluno_status_data ON alunos(status, data_matricula);
-- Índice único para garantir integridade
CREATE UNIQUE INDEX uk_email ON usuarios(email);
-- Visualização de índices existentes
SHOW INDEX FROM alunos;
-- Remoção segura
DROP INDEX idx_aluno_status_data ON alunos;
Restrições de Integridade
- PRIMARY KEY: Garante unicidaed e não nulidade — implícito um índice único.
- UNIQUE: Permite um único valor
NULL, diferentemente da chave primária. - AUTO_INCREMENT: Requer que o campo seja
KEY;TRUNCATEreseta o contador,DELETEnão. - FOREIGN KEY: Impõe consistência referencial, mas pode afetar desempenho e flexibilidade em arquiteturas distribuídas ou com alta concorrência.
Operadores Adicionais Úteis
UNION ALL: Combina resultados sem eliminação de duplicatas — mais rápido queUNION.LIMIT offset, count: Suporta paginação eficiente (ex:LIMIT 20, 10para página 3 com 10 itens).