Conceitos Fundamentais de Banco de Dados
Um banco de dados (BD) é uma coleção organizada de dados armazenados eletronicametne. Os dados são estruturados de forma a minimizar a redundância e maximizar a independência dos dados, permitindo acesso compartilhado por múltiplos usuários e aplicações.
Um Sistema de Gerenciamento de Banco de Dados (SGBD) é o software que interage diretamente com os usuários, aplicações e o próprio banco de dados para capturar e analisar dados. Ele fornece ferramentas para definir a estrutura (esquema) do banco de dados, inserir, manipular e recuperar dados, além de gerenciar o acesso e a segurança. Exemplos populares de SGBDs incluem Oracle, SQL Server, PostgreSQL e MySQL.
Iniciando com o MySQL
Instalação e Inicialização do Serviço
Em sistemas baseados em Linux, o MySQL ou seu fork MariaDB pode ser instalado via gerenciador de pacotes.
# Para instalar no CentOS/RHEL:
sudo yum install mysql-server
# Ou para o MariaDB:
sudo yum install mariadb-server
# Iniciar o serviço e habilitar na inicialização:
sudo systemctl start mysqld
sudo systemctl enable mysqld
Para verificar se o serviço está rodando e escutando na porta padrão (3306):
# Verificar processo
sudo systemctl status mysqld
# Verificar porta em uso
ss -tlnp | grep 3306
Segurança Inicial e Conexão
Após a instalação, é crucial executar o script de segurança para definir a senha root e remover configurações inseguras.
# Executar o script de segurança interativo
sudo mysql_secure_installation
Para se conectar ao servidor MySQL localmente:
# Conexão como usuário root (será solicitada a senha)
mysql -u root -p
# Conexão especificando host e porta
mysql -u root -p -h 127.0.0.1 -P 3306
Recuperação de Senha Esquecida
Se a senha do root for perdida, uma opção é reiniciar o servidor em modo seguro, ignorando as tabelas de privilégios.
# 1. Parar o serviço MySQL
sudo systemctl stop mysqld
# 2. Iniciar o servidor sem verificação de privilégios
sudo mysqld_safe --skip-grant-tables &
# 3. Conectar-se sem senha e atualizar a senha do root
mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('NovaSenha123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
# 4. Reiniciar o serviço normalmente
sudo systemctl restart mysqld
Linguagem SQL: Estrutura e Normas
SQL (Structured Query Language) é a linguagem padrão para interagir com bancos de dados relacionais. Ela permite definir estruturas de dados (DDL), manipular os dados (DML) e controlar o acesso (DCL).
Convenções de Escrita
- Comandos SQL são tipicamente escritos em letras maiúsculas para melhor legibilidade, embora não sejam sensíveis a maiúsculas.
- Cada instrução SQL é finalizada com um ponto e vírgula (
;). - Espaços e indentação são usados para organizar cláusulas complexas.
- Comentários de linha única usam
--, e blocos de comentário usam/* ... */.
Operações de Definição de Dados (DDL)
Comandos DDL são usados para criar, modificar e remover a estrutura dos objetos do banco de dados, como bancos e tabelas.
-- Criar um novo banco de dados
CREATE DATABASE IF NOT EXISTS meu_projeto CHARACTER SET utf8mb4;
-- Selecionar o banco de dados para uso
USE meu_projeto;
-- Criar uma tabela de clientes
CREATE TABLE clientes (
cliente_id INT PRIMARY KEY AUTO_INCREMENT,
nome_completo VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
data_cadastro DATE DEFAULT (CURRENT_DATE)
);
-- Visualizar a estrutura da tabela
DESCRIBE clientes;
-- Adicionar uma nova coluna à tabela
ALTER TABLE clientes ADD COLUMN telefone VARCHAR(20) AFTER email;
-- Renomear uma tabela
RENAME TABLE clientes TO cadastro_clientes;
-- Excluir uma tabela
DROP TABLE IF EXISTS cadastro_clientes;
Tipos de Dados no MySQL
O MySQL oferece uma variedade de tipos de dados, categorizados principalmente em:
- Numéricos: Como
INT,TINYINT,DECIMAL,FLOAT. - Data e Hora: Como
DATE,TIME,DATETIME,TIMESTAMP. - Strings: Como
CHAR(tamanho fixo),VARCHAR(tamanho variável),TEXTpara strings longas, eBLOBpara dados binários grandes.
Manipulação de Dados (DML)
Os comandos DML (Data Manipualtion Language) permitem inserir, atualizar, deletar e consultar dados.
Inserção de Dados (INSERT)
-- Inserir um único registro
INSERT INTO cadastro_clientes (nome_completo, email, telefone)
VALUES ('Ana Silva', 'ana.silva@email.com', '+5511999887766');
-- Inserir múltiplos registros
INSERT INTO cadastro_clientes (nome_completo, email) VALUES
('Carlos Souza', 'carlos.s@email.com'),
('Maria Oliveira', 'maria.o@email.com');
Atualização de Dados (UPDATE)
-- Atualizar o telefone de um cliente específico
UPDATE cadastro_clientes
SET telefone = '+5521999990000'
WHERE cliente_id = 1;
-- Aumentar todos os salários em 10% (supondo uma tabela com essa coluna)
UPDATE folha_pagamento SET salario = salario * 1.10;
Remoção de Dados (DELETE)
-- Deletar registros que atendam a uma condição
DELETE FROM cadastro_clientes WHERE data_cadastro < '2023-01-01';
-- Deletar TODOS os registros da tabela (cuidado!)
DELETE FROM cadastro_clientes;
-- Para redefinir o AUTO_INCREMENT, use:
ALTER TABLE cadastro_clientes AUTO_INCREMENT = 1;
Consultas de Seleção (SELECT) e Filtragem
A cláusula SELECT é usada para recuperar dados. Sua estrutura completa permite uma enorme flexibilidade.
SELECT [DISTINCT] colunas
FROM tabela
[WHERE condição]
[GROUP BY coluna [HAVING condição_agregada]]
[ORDER BY coluna [ASC|DESC]]
[LIMIT [offset,] linhas];
Exemplos Práticos de Consulta
-- Seleção básica e aliasing
SELECT nome_completo AS Nome, YEAR(data_cadastro) AS AnoCadastro
FROM cadastro_clientes;
-- Filtro com múltiplas condições e operador LIKE
SELECT * FROM cadastro_clientes
WHERE email LIKE '%@email.com' AND data_cadastro BETWEEN '2023-01-01' AND '2023-12-31';
-- Consulta com ordenação e limite
SELECT nome_completo, data_cadastro
FROM cadastro_clientes
ORDER BY data_cadastro DESC
LIMIT 10;
Agregação e Agrupamento
Funções agregadas (COUNT(), SUM(), AVG(), MAX(), MIN()) realizam cálculos sobre conjuntos de valores.
-- Contar o número de clientes por ano de cadastro
SELECT YEAR(data_cadastro) AS Ano, COUNT(*) AS TotalClientes
FROM cadastro_clientes
GROUP BY YEAR(data_cadastro);
-- Filtrar grupos com HAVING
SELECT departamento, AVG(salario) AS SalarioMedio
FROM funcionarios
GROUP BY departamento
HAVING AVG(salario) > 5000;
Integridade Referencial e Chaves Estrangeiras
Para relacionar tabelas e garantir a integridade dos dados, utilizamos chaves estrangeiras.
-- Tabela de departamentos (tabela pai)
CREATE TABLE departamentos (
dept_id INT PRIMARY KEY AUTO_INCREMENT,
nome_dept VARCHAR(50) NOT NULL
);
-- Tabela de funcionários (tabela filha)
CREATE TABLE funcionarios (
func_id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(100) NOT NULL,
dept_id INT,
CONSTRAINT fk_func_dept
FOREIGN KEY (dept_id)
REFERENCES departamentos(dept_id)
ON DELETE SET NULL -- Se um departamento for removido, o dept_id do funcionário vira NULL
ON UPDATE CASCADE -- Se o dept_id mudar na tabela pai, atualiza aqui também
);
Junções (JOINs) para Consultas Multitabelas
Junções permitem combinar linhas de duas ou mais tabelas com base em uma coluna relacionada entre elas.
-- INNER JOIN: Retorna apenas registros com correspondência nas duas tabelas.
SELECT f.nome AS Funcionario, d.nome_dept AS Departamento
FROM funcionarios f
INNER JOIN departamentos d ON f.dept_id = d.dept_id;
-- LEFT JOIN: Retorna todos os registros da tabela da esquerda e os correspondentes da direita.
SELECT f.nome, d.nome_dept
FROM funcionarios f
LEFT JOIN departamentos d ON f.dept_id = d.dept_id;
-- Junção com mais de duas tabelas e filtros
SELECT p.titulo, c.nome AS Cliente, v.valor
FROM pedidos v
JOIN produtos p ON v.produto_id = p.id
JOIN clientes c ON v.cliente_id = c.id
WHERE v.data_pedido > '2023-06-01';
Subconsultas (Subqueries)
Uma subconsulta é uma consulta SELECT aninhada dentro de outra instrução SQL.
-- Encontrar funcionários que trabalham no departamento 'TI'
SELECT nome FROM funcionarios
WHERE dept_id IN (
SELECT dept_id FROM departamentos WHERE nome_dept = 'TI'
);
-- Usando EXISTS para verificar a existência de dados
SELECT nome FROM funcionarios f
WHERE EXISTS (
SELECT 1 FROM projetos p WHERE p.responsavel_id = f.func_id
);