Conceitos Fundamentais do MySQL

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.

Tags: MySQL banco-de-dados SQL primary-key foreign-key

Publicado em 8-19 22:34