MySQL
1. Chave primária composta com auto incremento
O auto incremento no MySQL funciona em nível de sessão. Não é possível alterar a configuração do próximo valor de auto incremento diretamente, mas é possível modificar a tabela de configuração.
CREATE TABLE funcionarios (
id INT(11) NOT NULL AUTO_INCREMENT,
departamento_id INT(11) NOT NULL,
PRIMARY KEY (id, departamento_id)
) ENGINE=InnoDB AUTO_INCREMENT=10, DEFAULT CHARSET=UTF8;
2. Índices únicos
CREATE TABLE produtos (
id INT NOT NULL,
codigo INT,
descricao VARCHAR(100),
UNIQUE INDEX idx_codigo (codigo, descricao),
CONSTRAINT fk_produtos_categorias FOREIGN KEY (id) REFERENCES categorias(id)
);
2. Variações de chaves estrangeiras
a. Chave estrangeira com restrição única: relação um para um
b. Múltiplas chaves estrangeiras: relação muitos para muitos
c. Chave estrangeira nativa: relação um para muitos
3. Sentenças SQL mais utilizadas
3.1 Inserção (INSERT)
-- Inserir um único registro
INSERT INTO clientes (nome, telefone) VALUES ('João Silva', '11999999999');
-- Inserir múltiplos registros
INSERT INTO clientes (nome, telefone) VALUES ('João Silva', '11999999999'), ('Maria Santos', '11888888888');
-- Inserir dados de outra tabela
INSERT INTO tabela_nova (nome, email) SELECT nome, email FROM tabela_original;
3.2 Exclusão (DELETE)
-- Excluir todos os registros
DELETE FROM clientes;
-- Excluir com condição
DELETE FROM clientes WHERE id != 5;
DELETE FROM clientes WHERE id > 10;
DELETE FROM clientes WHERE id < 5;
DELETE FROM clientes WHERE id >= 3;
-- Operadores lógicos no WHERE
DELETE FROM clientes WHERE id != 5 OR nome = 'Maria';
DELETE FROM clientes WHERE id = 5 AND nome = 'João';
3.3 Atualização (UPDATE)
-- Atualizar campos específicos com condição
UPDATE produtos SET preco = 150.00 WHERE id >= 1;
3.4 Consulta (SELECT) - Consultas básicas
-- Consultar todos os registros
SELECT * FROM clientes;
-- Consultar colunas específicas
SELECT nome FROM clientes;
-- Utilizando WHERE
SELECT nome FROM clientes WHERE id > 10;
-- Utilizando AS para renomear coluna
SELECT id AS codigo FROM clientes;
-- Adicionar coluna constante
SELECT nome, telefone, 'ativo' AS status FROM clientes;
-- No MySQL, o operador de diferença pode ser <> ou !=
Outras consultas comuns
- Utilização do IN
-- Exemplo: Consultar registros com id 1, 5, 12
SELECT * FROM clientes WHERE id IN (1, 5, 12);
-- Exemplo: Consultar registros exceto id 1, 5, 12
SELECT * FROM clientes WHERE id NOT IN (1, 5, 12);
-- Uso dinâmico (subconsulta retorna apenas uma coluna)
SELECT * FROM clientes WHERE id IN (SELECT id FROM usuarios_ativo);
- Utilização do BETWEEN
-- Intervalo semi-aberto (inclusivo à esquerda, exclusivo à direita)
SELECT * FROM clientes WHERE id BETWEEN 5 AND 12;
- Curingas (LIKE)
-- Consultar registros que começam com 'a'
a% - qualquer caractere após 'a'
a_ - exatamente um caractere após 'a' (exemplo: ab)
-- Contém 'a' em qualquer posição
SELECT * FROM clientes WHERE nome LIKE '%a%';
-- Começa com 'A'
SELECT * FROM clientes WHERE nome LIKE 'A%';
-- Começa com 'a' seguido de exatamente um caractere
SELECT * FROM clientes WHERE nome LIKE 'a_';
- LIMIT - Paginação de resultados
-- Primeiros dez registros (um parâmetro = quantidade)
SELECT * FROM clientes LIMIT 10;
-- Dois parâmetros: (início, quantidade)
-- Exemplo: começar do décimo registro, buscar dez registros
SELECT * FROM clientes LIMIT 10, 10;
-- Intervalo específico usando OFFSET
-- Obter registros do 11º ao 20º
SELECT * FROM clientes LIMIT 10 OFFSET 10;
- Ordenação (ORDER BY)
-- DESC: maior para menor (decrescente)
-- ASC: menor para maior (crescente)
-- Dica: lembrar a ordem alfabetica A-B-C-D
SELECT * FROM clientes ORDER BY id DESC; -- Maior para menor
SELECT * FROM clientes ORDER BY id ASC; -- Menor para maior
-- Ordenar e limitar (geralmente para ver últimos registros)
SELECT * FROM clientes ORDER BY id DESC LIMIT 10;
-- Múltiplas ordenações
-- Se a primeira coluna tiver valores repetidos, usa a segunda como critério
SELECT * FROM clientes ORDER BY idade DESC, id DESC;
4. Operações de agrupamento (GROUP BY)
Criando tabela de exemplo para demonstração:
-- Palavra-chave: GROUP BY
SELECT COUNT(id), departamento_id FROM funcionarios GROUP BY departamento_id;
-- Funções de agregação mais comuns
/*
COUNT() - contar quantidade
MAX() - maior valor
MIN() - menor valor
SUM() - somatório
AVG() - média
*/
-- Sem GROUP BY, todos os dados são tratados como um único grupo
SELECT COUNT(id) FROM funcionarios;
Para filtrar resultados de funções de agregação, utilize HAVING
-- Exemplo: departamentos com mais de um funcionário
-- HAVING permite filtrar o resultado de funções de agregação
SELECT COUNT(id), departamento_id FROM funcionarios GROUP BY departamento_id HAVING COUNT(id) > 1;
Nota: funções de agregação não podem ser usadas na cláusula WHERE
5. Operações de junção de tabelas
Importante!
Para consultar dados de duas ou mais tabelas, usamos junções.
5.1 Junção simples
-- Junção básica (produto cartesiano)
SELECT * FROM funcionarios, departamentos;
-- Para filtrar corretamente, use condições no WHERE
SELECT * FROM funcionarios, departamentos WHERE funcionarios.depto_id = departamentos.id;
5.2 LEFT JOIN e RIGHT JOIN
O método anterior (5.1) funciona mas não é recomendado. O mais utilizado é o LEFT JOIN.
LEFT JOIN (Junção à esquerda)
Sintaxe: LEFT JOIN tabela ON condição
Exemplos de tabelas para junção:
-- Junção de duas tabelas
SELECT * FROM funcionarios LEFT JOIN departamentos ON funcionarios.depto_id = departamentos.id;
-- Múltiplas junções
SELECT
notas.aluno_id
FROM notas
LEFT JOIN alunos ON notas.aluno_id = alunos.id
LEFT JOIN disciplinas ON notas.disciplina_id = disciplinas.id
LEFT JOIN turmas ON alunos.turma_id = turmas.id
LEFT JOIN professors ON disciplinas.professor_id = professors.id;
-- Recomenda-se especificar as colunas ao invés de usar *
SELECT notas.aluno_id FROM notas
LEFT JOIN alunos ON notas.aluno_id = alunos.id
LEFT JOIN disciplinas ON notas.disciplina_id = disciplinas.id;
RIGHT JOIN (Junção à direita)
-- Junção de duas tabelas
SELECT * FROM funcionarios RIGHT JOIN departamentos ON funcionarios.depto_id = departamentos.id;
Diferença: no LEFT JOIN, a tabela da esquerda é exibida completamente; no RIGHT JOIN, a tabela da direita é exibida completamente.
Invertendo a ordem das tabelas no LEFT JOIN, o resultado será igual ao RIGHT JOIN. Por isso, recomedna-se usar apenas LEFT JOIN.
INNER JOIN (Junção interna)
-- LEFT JOIN e RIGHT JOIN podem gerar valores nulos
-- INNER JOIN esconde as linhas com valores nulos
SELECT * FROM funcionarios INNER JOIN departamentos ON funcionarios.depto_id = departamentos.id;
Nota: a prática leva à perfeição. A persistência na aprendizado leva ao domínio.