1- Introdução aos Bancos de Dados
Definição e Importância dos Bancos de Dados
Um banco de dados é uma coleção organizada de dados que pode ser facilmente acessada, gerenciada e atualizada. Em termos simples, é um lugar onde você armazena suas informações de forma estruturada para que possa recuperá-las e manipulá-las conforme necessário. A importância dos bancos de dados na era digital não pode ser subestimada:
- Armazenamento Centralizado: Armazena todos os dados em um local único, facilitando o acesso e a gestão.
- Eficiência: Melhora a eficiência ao permitir a recuperação rápida de dados.
- Segurança: Protege dados sensíveis através de várias camadas de segurança.
- Integridade: Mantém a integridade dos dados garantindo que estão corretos e consistentes.
- Escalabilidade: Permite o crescimento conforme a quantidade de dados aumenta.
Tipos de Bancos de Dados
- Relacionais:
- Exemplo: MySQL, PostgreSQL, SQLite.
- Características: Utilizam tabelas para armazenar dados, onde cada tabela é uma coleção de registros. Usam SQL (Structured Query Language) para manipulação e consulta de dados.
CREATE TABLE Usuarios (
id INT PRIMARY KEY,
nome VARCHAR(100),
email VARCHAR(100)
);
- Não Relacionais (NoSQL):
- Exemplo: MongoDB, Cassandra, Redis.
- Características: Não usam tabelas relacionais. Podem usar documentos, pares chave-valor, colunas largas ou grafos para armazenar dados. Mais flexíveis em termos de estrutura de dados.
{
"id": 1,
"nome": "João",
"email": "joao@example.com"
}
- Hierárquicos:
- Exemplo: IBM Information Management System (IMS).
- Características: Dados organizados em uma estrutura de árvore. Cada registro tem um único pai e zero ou mais filhos.
- Em Rede:
- Exemplo: Integrated Data Store (IDS).
- Características: Permite que um registro tenha múltiplas relações com outros registros, formando uma rede.
História dos Bancos de Dados
Os bancos de dados evoluíram significativamente ao longo do tempo:
- Anos 1960: Surgem os primeiros bancos de dados hierárquicos e em rede.
- Anos 1970: Introdução dos bancos de dados relacionais por Edgar F. Codd. SQL começa a ser desenvolvido.
- Anos 1980: SQL se torna o padrão de fato para bancos de dados relacionais. Surgem sistemas de gerenciamento de banco de dados (SGBD) comerciais como Oracle e IBM DB2.
- Anos 2000: Ascensão dos bancos de dados NoSQL para lidar com grandes volumes de dados não estruturados e distribuídos. Bancos de dados em nuvem ganham popularidade.
2. Linguagem SQL
Introdução ao SQL
SQL (Structured Query Language) é a linguagem padrão para interagir com bancos de dados relacionais. Com SQL, você pode criar, ler, atualizar e excluir dados em um banco de dados. É essencial para qualquer pessoa que queira trabalhar com bancos de dados relacionais.
Tipos de Comandos SQL
- DDL (Data Definition Language): Usado para definir e modificar a estrutura do banco de dados. Exemplos:
CREATE
,ALTER
,DROP
.CREATE TABLE Produtos (
id INT PRIMARY KEY,
nome VARCHAR(100),
preco DECIMAL(10, 2)
); - DML (Data Manipulation Language): Usado para manipular os dados dentro das tabelas. Exemplos:
INSERT
,UPDATE
,DELETE
.INSERT INTO Produtos (id, nome, preco) VALUES (1, 'Notebook', 2999.99);
- DCL (Data Control Language): Usado para controlar o acesso aos dados no banco de dados. Exemplos:
GRANT
,REVOKE
.GRANT SELECT ON Produtos TO usuario;
Como Rodar o SQL em um Site (sqlfiddle)
Uma ótima maneira de praticar SQL sem precisar configurar um servidor de banco de dados localmente é utilizando o site SQL Fiddle. Veja como:
- Acesse o SQL Fiddle.
- Selecione o tipo de banco de dados que você quer usar (por exemplo, MySQL, PostgreSQL).
- Pronto, agora você tem um BDD para praticar.
3. Criação e Manipulação de Tabelas
Comandos CREATE, ALTER, DROP
Os comandos DDL (Data Definition Language) são usados para definir e modificar a estrutura das tabelas no banco de dados. Vamos explorar cada um deles em detalhes.
CREATE TABLE 🛠️
O comando CREATE TABLE
é usado para criar novas tabelas no banco de dados. Aqui está a sintaxe básica:CREATE TABLE NomeDaTabela (
coluna1 tipo_dado restrições,
coluna2 tipo_dado restrições,
…
);
Exemplo:
CREATE TABLE Usuarios (
id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
data_nascimento DATE,
cidade VARCHAR(50),
estado CHAR(2),
criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE
O comando ALTER TABLE
é usado para modificar a estrutura de uma tabela existente. Você pode adicionar, modificar ou remover colunas, bem como adicionar ou remover restrições.
Adicionar Coluna:ALTER TABLE Usuarios ADD telefone VARCHAR(15);
Modificar Coluna:ALTER TABLE Usuarios MODIFY email VARCHAR(150) NOT NULL;
Remover Coluna:ALTER TABLE Usuarios DROP COLUMN estado;
DROP TABLE
O comando DROP TABLE
é usado para excluir uma tabela e todos os seus dados do banco de dados.DROP TABLE Usuarios;
Tipos de Dados em SQL
Selecionar o tipo de dado correto para cada coluna é crucial para a eficiência e integridade do banco de dados. Aqui estão os tipos de dados mais comuns em SQL:
- INT: Números inteiros. Exemplo:
INT
,SMALLINT
,BIGINT
. - FLOAT, DOUBLE: Números de ponto flutuante. Exemplo:
FLOAT
,DOUBLE
. - DECIMAL: Números decimais precisos. Exemplo:
DECIMAL(10, 2)
(10 dígitos no total, 2 após o ponto decimal). - CHAR, VARCHAR: Strings de comprimento fixo e variável. Exemplo:
CHAR(10)
,VARCHAR(255)
. - TEXT: Texto longo.
- DATE, TIME, DATETIME, TIMESTAMP: Data e hora. Exemplo:
DATE
,TIME
,TIMESTAMP
. - BOOLEAN: Valores booleanos (
TRUE
ouFALSE
).
Exemplo:CREATE TABLE Produtos (
id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
preco DECIMAL(10, 2) NOT NULL,
quantidade INT DEFAULT 0,
descricao TEXT,
criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Restrições (Constraints) e Chaves Primárias/Estrangeiras
As restrições são regras aplicadas às colunas para garantir a integridade dos dados.
PRIMARY KEY
A chave primária é uma coluna ou conjunto de colunas que identifica exclusivamente cada registro na tabela.
CREATE TABLE Clientes (
id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);
FOREIGN KEY
A chave estrangeira é uma coluna que cria uma relação entre duas tabelas. Ela deve referenciar uma chave primária em outra tabela.
CREATE TABLE Pedidos (
id INT PRIMARY KEY,
cliente_id INT,
data_pedido DATE,
FOREIGN KEY (cliente_id) REFERENCES Clientes(id)
);
UNIQUE
Garante que todos os valores em uma coluna sejam distintos.CREATE TABLE Usuarios (
id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100) UNIQUE
);
NOT NULL
Garante que uma coluna não pode conter valores nulos.CREATE TABLE Produtos (
id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
preco DECIMAL(10, 2) NOT NULL
);
CHECK
Garante que todos os valores em uma coluna satisfaçam uma condição específica.CREATE TABLE Funcionarios (
id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
salario DECIMAL(10, 2) CHECK (salario > 0)
);
4. Inserção, Atualização e Exclusão de Dados
Comandos INSERT, UPDATE, DELETE
A manipulação de dados é uma das operações mais comuns em SQL. Vamos explorar como inserir, atualizar e excluir dados nas tabelas de um banco de dados.
INSERT INTO
O comando INSERT INTO
é usado para adicionar novos registros a uma tabela.
Sintaxe Básica:
INSERT INTO NomeDaTabela (coluna1, coluna2, ...) VALUES (valor1, valor2, ...);
Exemplo:
INSERT INTO Clientes (id, nome, email, data_registro) VALUES (1, 'João Silva', 'joao@example.com', '2023-01-15');
Você também pode inserir vários registros de uma vez:
INSERT INTO Clientes (id, nome, email, data_registro) VALUES (2, 'Maria Oliveira', 'maria@example.com', '2023-02-20'), (3, 'Pedro Santos', 'pedro@example.com', '2023-03-10');
UPDATE
O comando UPDATE
é usado para modificar os dados existentes em uma tabela.
Sintaxe Básica:
UPDATE NomeDaTabela SET coluna1 = valor1, coluna2 = valor2, ... WHERE condição;
Exemplo:
UPDATE Clientes SET email = 'novoemail@example.com' WHERE id = 1;
Exemplo mais complexo:
UPDATE Produtos SET preco = preco * 1.10 WHERE categoria = 'Eletrônicos';
DELETE
O comando DELETE
é usado para remover registros de uma tabela.
Sintaxe Básica:
DELETE FROM NomeDaTabela WHERE condição;
Exemplo:
DELETE FROM Clientes WHERE id = 3;
Para excluir todos os registros de uma tabela:
DELETE FROM Clientes;
Gerenciamento de Transações
Transações são um conjunto de operações que devem ser executadas como uma unidade única. O gerenciamento de transações garante que todas as operações sejam concluídas com sucesso ou que nenhuma alteração seja feita no banco de dados.
COMMIT
O comando COMMIT
salva todas as alterações feitas durante a transação.
START TRANSACTION; UPDATE Produtos SET preco = preco * 0.90 WHERE categoria = 'Promoção'; DELETE FROM Produtos WHERE estoque = 0; COMMIT;
ROLLBACK
O comando ROLLBACK
desfaz todas as alterações feitas durante a transação, retornando o banco de dados ao estado anterior ao início da transação.
START TRANSACTION; UPDATE Produtos SET preco = preco * 0.90 WHERE categoria = 'Promoção'; DELETE FROM Produtos WHERE estoque = 0; ROLLBACK;
5. Consultas e Recuperação de Dados
Comando SELECT
O comando SELECT
é usado para consultar e recuperar dados de uma tabela. É a base das operações de leitura em SQL.
Sintaxe Básica:
SELECT coluna1, coluna2, ... FROM NomeDaTabela;
Exemplo:
SELECT nome, email FROM Clientes;
Para selecionar todas as colunas, você pode usar o asterisco (*
):
SELECT * FROM Clientes;
Cláusulas WHERE, ORDER BY, GROUP BY, HAVING
Estas cláusulas ajudam a refinar e organizar os dados retornados pelas consultas.
WHERE
A cláusula WHERE
filtra os registros com base em uma condição específica.
Sintaxe:
SELECT * FROM Clientes WHERE cidade = 'São Paulo';
ORDER BY
A cláusula ORDER BY
ordena os resultados com base em uma ou mais colunas.
Sintaxe:
SELECT * FROM Produtos ORDER BY preco DESC;
GROUP BY
A cláusula GROUP BY
agrupa os registros que têm valores idênticos em colunas especificadas.
Sintaxe:
SELECT cidade, COUNT(*) FROM Clientes GROUP BY cidade;
HAVING
A cláusula HAVING
é usada para filtrar grupos de registros após a aplicação da cláusula GROUP BY
.
Sintaxe:
SELECT cidade, COUNT(*) FROM Clientes GROUP BY cidade HAVING COUNT(*) > 1;
Funções Agregadas
As funções agregadas realizam cálculos em um conjunto de valores e retornam um único valor.
COUNT
Conta o número de registros.
Exemplo:
SELECT COUNT(*) FROM Clientes;
SUM
Soma os valores de uma coluna.
Exemplo:
SELECT SUM(preco) FROM Produtos;
AVG
Calcula a média dos valores de uma coluna.
Exemplo:
SELECT AVG(preco) FROM Produtos;
MAX
Retorna o valor máximo de uma coluna.
Exemplo:
SELECT MAX(preco) FROM Produtos;
MIN
Retorna o valor mínimo de uma coluna.
Exemplo:
SELECT MIN(preco) FROM Produtos;
Junções (JOINs)
As junções são usadas para combinar registros de duas ou mais tabelas com base em uma coluna relacionada entre elas.
INNER JOIN
Retorna registros que têm correspondências em ambas as tabelas.
Sintaxe:
SELECT Pedidos.id, Clientes.nome
FROM Pedidos
INNER JOIN Clientes ON Pedidos.cliente_id = Clientes.id;
LEFT JOIN
Retorna todos os registros da tabela da esquerda e os registros correspondentes da tabela da direita. Se não houver correspondência, os resultados da tabela da direita serão nulos.
Sintaxe:
SELECT Pedidos.id, Clientes.nome
FROM Pedidos
LEFT JOIN Clientes ON Pedidos.cliente_id = Clientes.id;
RIGHT JOIN
Retorna todos os registros da tabela da direita e os registros correspondentes da tabela da esquerda. Se não houver correspondência, os resultados da tabela da esquerda serão nulos.
Sintaxe:
SELECT Pedidos.id, Clientes.nome
FROM Pedidos
RIGHT JOIN Clientes ON Pedidos.cliente_id = Clientes.id;
FULL JOIN
Retorna registros quando há uma correspondência em uma das tabelas. Retorna todos os registros quando há uma correspondência em uma das tabelas.
Sintaxe:
SELECT Pedidos.id, Clientes.nome
FROM Pedidos
FULL OUTER JOIN Clientes ON Pedidos.cliente_id = Clientes.id;
Subconsultas e Consultas Aninhadas
Subconsultas são consultas dentro de outras consultas. Elas são usadas para realizar operações mais complexas.
Exemplo:
SELECT nome
FROM Clientes
WHERE id IN (
SELECT cliente_id
FROM Pedidos
WHERE data_pedido > '2023-01-01'
);
6. Índices e Performance
O que são Índices e como eles funcionam
Os índices são estruturas de dados especiais que melhoram a velocidade das operações de consulta em uma tabela de banco de dados. Eles são semelhantes aos índices em livros, que permitem localizar informações rapidamente sem precisar percorrer todas as páginas. Em um banco de dados, um índice é criado em uma ou mais colunas de uma tabela e permite que o SGBD (Sistema de Gerenciamento de Banco de Dados) localize rapidamente as linhas correspondentes.
Exemplo de Criação de Índice:
CREATE INDEX idx_nome ON Clientes(nome);
Este índice acelera as consultas que filtram ou ordenam pela coluna nome
.
Tipos de Índices
- Índice Simples: Criado em uma única coluna.
CREATE INDEX idx_email ON Usuarios(email);
- Índice Composto: Criado em duas ou mais colunas.
CREATE INDEX idx_nome_email ON Usuarios(nome, email);
- Índice Único: Garante que todos os valores em uma coluna ou conjunto de colunas sejam únicos.
CREATE UNIQUE INDEX idx_email_unico ON Usuarios(email);
- Índice de Texto Completo: Usado para realizar pesquisas em grandes textos.
CREATE FULLTEXT INDEX idx_descricao ON Produtos(descricao);
Criação e Gerenciamento de Índices
Criando Índices
Para criar um índice, use o comando CREATE INDEX
. A sintaxe básica é:
CREATE INDEX nome_do_indice ON NomeDaTabela(coluna);
Exemplo:
CREATE INDEX idx_preco ON Produtos(preco);
Removendo Índices
Para remover um índice, use o comando DROP INDEX
.
Exemplo:
DROP INDEX idx_preco ON Produtos;
Considerações sobre Índices
- Benefícios: Aumentam a velocidade das consultas de leitura.
- Desvantagens: Podem diminuir a velocidade das operações de inserção, atualização e exclusão, pois os índices também precisam ser atualizados.
- Melhores Práticas: Crie índices em colunas que são frequentemente usadas em cláusulas
WHERE
,JOIN
eORDER BY
.
Análise de Desempenho e Otimização de Consultas
Para garantir que suas consultas SQL sejam eficientes, é importante analisar e otimizar o desempenho das mesmas.
Analisando Consultas com EXPLAIN
A maioria dos SGBDs oferece uma maneira de analisar como uma consulta será executada. Em MySQL, por exemplo, você pode usar o comando EXPLAIN
.
Exemplo:
EXPLAIN SELECT * FROM Produtos WHERE preco > 100;
Este comando retornará um plano de execução que mostra como o SGBD pretende executar a consulta, incluindo informações sobre quais índices serão usados.
Técnicas de Otimização
- Usar Índices Apropriadamente: Certifique-se de que as colunas usadas em cláusulas
WHERE
,JOIN
eORDER BY
tenham índices. - Evitar Seleção de Colunas Desnecessárias: Não use
SELECT *
a menos que precise de todas as colunas. Em vez disso, selecione apenas as colunas necessárias.SELECT nome, preco FROM Produtos WHERE preco > 100;
- Usar Junções com Sabedoria: Certifique-se de que as colunas usadas em junções tenham índices e minimize o número de junções complexas.
SELECT Pedidos.id, Clientes.nome
FROM Pedidos
INNER JOIN Clientes ON Pedidos.cliente_id = Clientes.id; - Evitar Subconsultas Não Necessárias: Subconsultas podem ser menos eficientes que junções. Considere reescrever subconsultas como junções quando possível.
-- Subconsulta
SELECT nome
FROM Clientes
WHERE id IN (
SELECT cliente_id
FROM Pedidos
WHERE data_pedido > '2023-01-01'
);
-- Reescrita como junção
SELECT DISTINCT Clientes.nome
FROM Clientes
INNER JOIN Pedidos ON Clientes.id = Pedidos.cliente_id
WHERE Pedidos.data_pedido > '2023-01-01'; - Usar Limites em Consultas de Grandes Volumes: Para consultas que retornam muitos registros, use LIMIT para restringir o número de resultados.
SELECT nome FROM Produtos WHERE preco > 100 LIMIT 10;