Fundamentos do MySQL: Linguagem SQL e Administração de Bancos de Dados

Conceitos Essenciais de Banco de Dados

Sistemas de Gerenciamento de Bancos de Dados Relacionais (SGBDR)

Um SGBDR organiza os dados em tabelas relacionadas, compreendendo linhas (registros) e colunas (campos). O SQL (Structured Query Language) é a linguagem padrão para interagir com esses sistemas.

Principais vantagens:

  • Permite a execução de consultas complexas envolvendo múltiplas tabelas através de junções.
  • Suporta transações, garantindo a integridade e a atomicidade das operações.

Sistemas Não Relacionais (NoSQL)

Esses sistemas frequentemente utilizam modelos como chave-valor, documentos, colunas ou grafos. Eles são otimizados para cenários específicos, oferecendo alta performance e escalabilidade horizontal, sacrificando parte da flexibilidade de consultas do SQL tradicional.

Categorias da Linguagem SQL

  • DDL (Data Definition Language): Define e modifica a estrutura dos objetos do banco de dados (como bancos, tabelas e colunas).
  • DML (Data Manipulation Language): Gerencia os dados dentro das tabelas (inserção, atualização, remoção).
  • DQL (Data Query Language): Recupera dados do banco de dados.
  • DCL (Data Control Language): Controla o acesso e as permissões dos usuários.

Linguagem de Definição de Dados (DDL)

Manipulação de Bancos de Dados

-- Listar todos os bancos de dados
SHOW DATABASES;

-- Criar um novo banco de dados
CREATE DATABASE IF NOT EXISTS meusistema
DEFAULT CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci;

-- Selecionar um banco para uso
USE meusistema;

Observação: Prefira o charset utf8mb4 para suporte completo a caracteres Unicode, incluindo emojis.

Criação e Alteração de Tabelas

-- Criar uma tabela de funcionários
CREATE TABLE funcionarios (
    id_func INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Identificador único',
    matricula VARCHAR(15) NOT NULL UNIQUE COMMENT 'Matrícula do funcionário',
    nome_completo VARCHAR(100) NOT NULL COMMENT 'Nome completo',
    genero ENUM('M', 'F', 'O') COMMENT 'Gênero',
    idade TINYINT UNSIGNED CHECK (idade > 17 AND idade < 100),
    documento CHAR(14) COMMENT 'CPF ou documento similar',
    dt_contratacao DATE COMMENT 'Data de contratação'
) COMMENT 'Tabela principal de funcionários';

-- Adicionar uma nova coluna
ALTER TABLE funcionarios ADD COLUMN apelido VARCHAR(30) COMMENT 'Apelido';

-- Modificar o tipo de uma coluna
ALTER TABLE funcionarios MODIFY COLUMN apelido VARCHAR(50);

-- Renomear uma coluna e alterar seu tipo
ALTER TABLE funcionarios CHANGE COLUMN apelido nickname VARCHAR(40) COMMENT 'Nome de usuário';

-- Remover uma coluna
ALTER TABLE funcionarios DROP COLUMN nickname;

Manipulação de Dados (DML)

Inserção de Registros

-- Inserir um único registro com campos específicos
INSERT INTO funcionarios (matricula, nome_completo, idade, dt_contratacao)
VALUES ('FUNC-001', 'Ana Silva', 28, '2023-05-15');

-- Inserir múltiplos registros
INSERT INTO funcionarios (matricula, nome_completo, genero, idade)
VALUES
('FUNC-002', 'Carlos Souza', 'M', 32),
('FUNC-003', 'Maria Oliveira', 'F', 29);

Atualização e Remoção

-- Atualizar dados com condição
UPDATE funcionarios SET nome_completo = 'Ana Silva Costa' WHERE matricula = 'FUNC-001';

-- Remover registros com condição
DELETE FROM funcionarios WHERE idade < 18;

-- Importante: Uma instrução UPDATE ou DELETE sem cláusula WHERE afetará TODOS os registros da tabela.

Consulta de Dados (DQL)

Estrutura Básica e Filtros

SELECT coluna1, coluna2, ...
FROM tabela
[WHERE condição]
[GROUP BY colunas_agrupamento]
[HAVING condição_agrupada]
[ORDER BY coluna_ordem [ASC|DESC]]
[LIMIT offset, quantidade];

Exemplos de Consulta

-- Consulta com alias e filtro
SELECT nome_completo AS 'Nome', idade AS 'Idade'
FROM funcionarios
WHERE idade >= 25 AND genero = 'F'
ORDER BY idade DESC;

-- Consulta com LIKE (coringas: '_' para um caractere, '%' para vários)
SELECT * FROM funcionarios WHERE nome_completo LIKE 'Ana%';

-- Consulta com lista de valores
SELECT * FROM funcionarios WHERE matricula IN ('FUNC-001', 'FUNC-003');

Funções de Agregação

-- Contar todos os funcionários
SELECT COUNT(*) AS total_funcionarios FROM funcionarios;

-- Calcular idade média
SELECT AVG(idade) AS idade_media FROM funcionarios;

-- Encontrar a idade máxima por gênero
SELECT genero, MAX(idade) AS maior_idade
FROM funcionarios
GROUP BY genero;

Agrupamento e Filtragme de Grupos

-- Agrupar por gênero e filtrar grupos com mais de 5 membros
SELECT genero, COUNT(*) AS quantidade
FROM funcionarios
GROUP BY genero
HAVING quantidade > 5;

Junções (Joins)

-- Criar tabela de departamentos
CREATE TABLE departamentos (
    id_dept INT PRIMARY KEY AUTO_INCREMENT,
    nome_dept VARCHAR(50) NOT NULL
);
-- Adicionar chave estrangeira na tabela de funcionários
ALTER TABLE funcionarios ADD COLUMN id_departamento INT;
ALTER TABLE funcionarios ADD CONSTRAINT fk_func_dept
FOREIGN KEY (id_departamento) REFERENCES departamentos(id_dept);

-- Junção interna (INNER JOIN) - retorna apenas registros correspondentes
SELECT f.nome_completo, d.nome_dept
FROM funcionarios f
INNER JOIN departamentos d ON f.id_departamento = d.id_dept;

-- Junção externa esquerda (LEFT JOIN) - retorna todos da tabela esquerda
SELECT f.nome_completo, COALESCE(d.nome_dept, 'Sem Departamento') AS dept
FROM funcionarios f
LEFT JOIN departamentos d ON f.id_departamento = d.id_dept;

Funções Internas

Funções de String

-- Concatenar strings
SELECT CONCAT(nome_completo, ' - ', matricula) AS identificacao FROM funcionarios;

-- Converter para maiúsculas e minúsculas
SELECT UPPER(nome_completo), LOWER(documento) FROM funcionarios;

-- Preenchimento à esquerda para padronizar matrículas
SELECT LPAD(matricula, 10, '0') FROM funcionarios;

Funções de Data

-- Data e hora atuais
SELECT NOW(), CURDATE(), CURTIME();

-- Calcular anos de serviço
SELECT nome_completo, TIMESTAMPDIFF(YEAR, dt_contratacao, CURDATE()) AS anos_servico
FROM funcionarios;

Funções Condicionais

-- Classificar faixas etárias
SELECT nome_completo, idade,
CASE
    WHEN idade < 30 THEN 'Jovem'
    WHEN idade BETWEEN 30 AND 50 THEN 'Sênior'
    ELSE 'Veterano'
END AS faixa_etaria
FROM funcionarios;

Restrições (Constraints)

As restrições garantem a integridade dos dados. As principais são:

  • PRIMARY KEY: Identificador único e não nulo para cada registro.
  • FOREIGN KEY: Vincula dados entre duas tabelas, garantindo consistência.
  • UNIQUE: Garante que todos os valores em uma coluna sejam diferentes.
  • NOT NULL: Impede a inserção de valores nulos.
  • CHECK: Valida os dados com base em uma condição booleana.
  • DEFAULT: Define um valor padrão se nenhum for fornecido.

Comportamentos de Chave Estrangeira (ON DELETE/UDPATE):

  • NO ACTION / RESTRICT: Impede a operação na tabela pai se houver registros filhos correspondentes.
  • CASCADE: Propaga a operação (exclusão ou atualização) para os registros filhos.
  • SET NULL: Define a chave estrangeira nos registros filhos como NULL (requer que a coluna aceite nulos).

Transações e Concorrência

Uma transação agrupa um conjunto de operações que devem ser executadas como uma unidade atômica.

-- Exemplo de transação
START TRANSACTION;
UPDATE contas SET saldo = saldo - 1000 WHERE titular = 'João';
UPDATE contas SET saldo = saldo + 1000 WHERE titular = 'Maria';
COMMIT; -- Ou ROLLBACK; em caso de erro

Propriedades ACID

  • Atomicidade: Tudo ou nada. A transação é executada por completo ou não é executada.
  • Consistência: O banco de dados move de um estado válido para outro estado válido.
  • Isolamento: Transações concorrentes não interferem umas nas outras.
  • Durabilidade: Uma vez confirmada (commit), as alterações são permanentes.

Problemas de Concorrência e Níveis de Isolamento

Problemas comuns incluem leituras sujas, leituras não repetíveis e fantasmas. O MySQL padrão utiliza o nível REPEATABLE READ. Para alterar a sessão atual:

-- Verificar o nível de isolamento atual
SELECT @@TRANSACTION_ISOLATION;

-- Definir um novo nível para a sessão
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

Motores de Armazenamento

O motor de armazenamento (storage engine) define como os dados são armazenados, indexados e gerenciados. A escolha impacta diretamente na performance e nas funcionalidades.

InnoDB (Padrão)

  • Suporte completo a transações e chaves estrangeiras.
  • Utiliza bloqueio de linha, favorecendo a concorrência.
  • Dados e índices são armazenados em arquivos .ibd.

MyISAM

  • Não suporta transações nem chaves estrangeiras.
  • Oferece bloqueio de tabela, com bom desempenho para leituras pesadas.
  • Arquivos separados para dados (.MYD) e índices (.MYI).

Memory

  • Armazena todos os dados na memória RAM, resultando em velocidade extrema.
  • Ideal para tabelas temporárias ou caches. Os dados são perdidos ao reiniciar o servidor.

Resumo de Características

Característica InnoDB MyISAM Memory
Transações Sim Não Não
Chaves Estrangeiras Sim Não Não
Bloqueio Linha Tabela Tabela

Tags: MySQL SQL DDL DML DQL

Publicado em 6-20 00:30