Tópicos Avançados de MySQL

  1. Views ========

Conceito

Uma view no MySQL é uma tabela virtual resultante de uma consulta SELECT. Ela não armazena dados fisicamente, mas permite acessar dados de tabelas subjacentes como se fosse uma tabela real. As views são úteis para simplificar consultas complexas, reutilizar código SQL e controlar o acesso aos dados.

Sintaxe

CREATE VIEW nome_da_view AS consulta_sql;

Exemplo Prático

Criar tabela base:
CREATE TABLE funcionarios (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(50),
    departamento VARCHAR(30),
    salario DECIMAL(10,2)
);

Inserir dados:
INSERT INTO funcionarios (nome, departamento, salario) VALUES 
('Ana', 'TI', 5000),
('Bruno', 'Marketing', 4500),
('Carlos', 'TI', 6000);

Criar view para funcionários do departamento de TI:
CREATE VIEW vw_funcionarios_ti AS 
SELECT id, nome, salario FROM funcionarios WHERE departamento = 'TI';

Consultar a view:
SELECT * FROM vw_funcionarios_ti;

Excluir view:
DROP VIEW IF EXISTS vw_funcionarios_ti;

Observações

Views permitem operações de leitura, mas modificações diretas (INSERT, UPDATE, DELETE) são desencorajadas, pois podem gerar comportamentos imprevisíveis nas tabelas base. Utilize veiws principalmente para consultas.

  1. Triggers ===========

Conceito

Triggers são procedimentos armazenados que são executados automaticamente em resposta a eventos específicos em uma tabela, como INSERT, UPDATE ou DELETE. Eles podem ser configurados para disparar antes ou depois dessas operações.

Sintaxe

DELIMITER $$
CREATE TRIGGER nome_do_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nome_tabela FOR EACH ROW
BEGIN
    -- comandos SQL
END $$
DELIMITER ;

Exemplo Prático

Criar tabela de comandos:
CREATE TABLE comandos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    usuario VARCHAR(30),
    comando VARCHAR(50),
    data_exec DATETIME,
    status ENUM('sucesso', 'falha')
);

Criar tabela de log de erros:
CREATE TABLE log_erros (
    id INT PRIMARY KEY AUTO_INCREMENT,
    comando_erro VARCHAR(50),
    data_erro DATETIME
);

Criar trigger para registrar erros após inserção:
DELIMITER $$
CREATE TRIGGER trg_log_erros AFTER INSERT ON comandos FOR EACH ROW
BEGIN
    IF NEW.status = 'falha' THEN
        INSERT INTO log_erros (comando_erro, data_erro) 
        VALUES (NEW.comando, NEW.data_exec);
    END IF;
END $$
DELIMITER ;

Inserir dados para testar:
INSERT INTO comandos (usuario, comando, data_exec, status) VALUES 
('usuario1', 'ls -l', NOW(), 'sucesso'),
('usuario2', 'rm invalido', NOW(), 'falha');

Verificar log de erros:
SELECT * FROM log_erros;

Exclusão de Triggers

DROP TRIGGER IF EXISTS trg_log_erros;
  1. Transações =============

Conceito

Uma transação é uma sequência de operações de banco de dados tratadas como uma unidade atômica. Ela garante que todas as operações sejam concluídas com sucesso ou que nenhuma alteração seja applicada em caso de falha, mantendo a integridade dos dados.

Propriedades ACID

  • Atomicidade: A transação é indivisível.
  • Consistência: O banco de dados permanece em um estado válido após a transação.
  • Isolamento: Transações concorrentes não interferem umas nas outras.
  • Durabilidade: Alterações confirmadas são permanentes, mesmo após falhas do sistema.

Exemplo Prático

Criar tabela de contas:
CREATE TABLE contas (
    id INT PRIMARY KEY AUTO_INCREMENT,
    titular VARCHAR(50),
    saldo DECIMAL(10,2)
);

Inserir dados:
INSERT INTO contas (titular, saldo) VALUES 
('Maria', 1000),
('João', 500);

Iniciar transação para transferência:
START TRANSACTION;

Atualizar saldo de Maria:
UPDATE contas SET saldo = saldo - 200 WHERE titular = 'Maria';

Atualizar saldo de João:
UPDATE contas SET saldo = saldo + 200 WHERE titular = 'João';

Confirmar transação:
COMMIT;

Em caso de erro, usar rollback:
ROLLBACK;
  1. Procedimentos Armazenados ============================

Conceito

Procedimentos armazenados são blocos de código SQL armazenados no servidor do banco de dados. Eles podem aceitar parâmetros e executar uma série de comandos, semelhantes a funções em linguagens de programação.

Sintaxe

DELIMITER $$
CREATE PROCEDURE nome_procedimento (parametros)
BEGIN
    -- comandos SQL
END $$
DELIMITER ;

Exemplo Prático

Criar procedimento para buscar funcionários por faixa salarial:
DELIMITER $$
CREATE PROCEDURE sp_buscar_funcionarios_salario (
    IN salario_min DECIMAL(10,2),
    IN salario_max DECIMAL(10,2),
    OUT total INT
)
BEGIN
    SELECT nome, salario FROM funcionarios 
    WHERE salario BETWEEN salario_min AND salario_max;
    
    SELECT COUNT(*) INTO total FROM funcionarios 
    WHERE salario BETWEEN salario_min AND salario_max;
END $$
DELIMITER ;

Chamar o procedimento:
CALL sp_buscar_funcionarios_salario(4000, 6000, @total);
SELECT @total;

Gerenciamento

Ver detalhes:
SHOW CREATE PROCEDURE sp_buscar_funcionarios_salario;

Listar todos:
SHOW PROCEDURE STATUS;

Excluir:
DROP PROCEDURE IF EXISTS sp_buscar_funcionarios_salario;
  1. Funções Built-in ===================

MySQL oferece diversas funções integrdaas para manipulação de dados:

  • String: CONCAT(), SUBSTRING(), UPPER(), LOWER(), LENGTH(), TRIM(), LEFT(), RIGHT()
  • Data/Hora: NOW(), CURDATE(), CURTIME(), DATE_FORMAT()
  • Numéricas: ROUND(), FLOOR(), CEILING(), ABS()
Exemplos:
SELECT CONCAT('Hello', ' ', 'World') AS frase;
SELECT SUBSTRING('MySQL Database', 1, 5) AS substring_result;
SELECT NOW() AS data_atual;
  1. Controle de Fluxo ====================

MySQL suporta estruturas de controle para lógica condicional e loops:

Estrutura IF

IF condicao THEN
    -- código
ELSEIF outra_condicao THEN
    -- código
ELSE
    -- código
END IF;

Loop WHILE

DECLARE contador INT DEFAULT 0;
WHILE contador < 5 DO
    SELECT contador;
    SET contador = contador + 1;
END WHILE;
  1. Índices ==========

Conceito

Índices são estruturas de dados que otimizam a velocidade de consultas em tabelas do banco de dados. Eles funcionam como índices em um livro, permitindo localizar registros rapidamente sem verificar toda a tabela.

Tipos de Índices

  • PRIMARY KEY: Cria um índice único automaticamente.
  • UNIQUE: Garante que todos os valores na coluna sejam distintos.
  • INDEX: Índice comum para acelerar consultas.
  • FOREIGN KEY: Relaciona tabelas, mas não é primariamente para performance.

Considerações

  • Índices aceleram leituras (SELECT), mas podem desacelerar escritas (INSERT, UPDATE, DELETE).
  • Crie índices em colunas frequentemente usadas em cláusulas WHERE, JOIN ou ORDER BY.
  • Evite criar índices em tabelas pequenas ou com atualizações muito frequentes.
Exemplo de criação de índice:
CREATE INDEX idx_funcionario_nome ON funcionarios(nome);

Tags: MySQL SQL Views triggers Transações

Publicado em 6-15 16:59 por Thomas