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 comoNULL(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 |