Sintaxe Essencial do MySQL para Desenvolvedores

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 nome
  • CHANGE COLUMN genero sexo ENUM('M','F','O')
  • MODIFY COLUMN nome VARCHAR(80) NOT NULL
  • DROP COLUMN data_nascimento
  • RENAME 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 NULL
  • WHERE 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 NULL campos 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; TRUNCATE reseta o contador, DELETE nã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 que UNION.
  • LIMIT offset, count: Suporta paginação eficiente (ex: LIMIT 20, 10 para página 3 com 10 itens).

Tags: MySQL SQL database DDL DML

Publicado em 8-30 11:39