Banco de Dados | Modelagem e SQL - Básico

🗄️ Banco de Dados

Modelagem Relacional • SQL • Consultas • Fundamentos Essenciais

⚡ Entidades • Relacionamentos • CRUD • Joins • Normalização

📊 Modelagem de Dados

Processo de estruturar dados em entidades, atributos e relacionamentos.

┌─────────────────┐ ┌─────────────────┐ │ CLIENTE │ │ PEDIDO │ ├─────────────────┤ ├─────────────────┤ │ id_cliente (PK) │────▶│ id_pedido (PK) │ │ nome │ │ id_cliente (FK) │ │ email │ │ data_pedido │ │ telefone │ │ valor_total │ └─────────────────┘ └─────────────────┘
  • Entidade: objeto do mundo real (Cliente, Produto)
  • Atributo: propriedade da entidade (nome, preço)
  • Chave Primária (PK): identifica unicamente cada registro
  • Chave Estrangeira (FK): referência a outra tabela

🔗 Tipos de Relacionamento

  • 1:1 (Um para Um) – Pessoa → CPF
  • 1:N (Um para Muitos) – Cliente → Pedidos
  • N:N (Muitos para Muitos) – Aluno ↔ Curso (tabela associativa)
-- Tabela associativa para N:N CREATE TABLE aluno_curso ( id_aluno INT, id_curso INT, data_matricula DATE, PRIMARY KEY (id_aluno, id_curso), FOREIGN KEY (id_aluno) REFERENCES aluno(id), FOREIGN KEY (id_curso) REFERENCES curso(id) );

📐 Normalização

Processo de organizar dados para reduzir redundância e evitar anomalias.

  • 1NF: valores atômicos, sem grupos repetitivos
  • 2NF: depende totalmente da chave primária
  • 3NF: sem dependências transitivas
💡 Tabelas normalizadas facilitam manutenção e evitam inconsistências.

📝 DDL - Data Definition Language

Comandos para definir a estrutura do banco de dados.

-- Criar tabela CREATE TABLE cliente ( id INT PRIMARY KEY AUTO_INCREMENT, nome VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE, data_cadastro DATE DEFAULT CURRENT_DATE ); -- Alterar tabela ALTER TABLE cliente ADD COLUMN telefone VARCHAR(15); ALTER TABLE cliente MODIFY COLUMN nome VARCHAR(150); ALTER TABLE cliente DROP COLUMN telefone; -- Excluir tabela DROP TABLE cliente; -- Criar índice CREATE INDEX idx_cliente_nome ON cliente(nome);

✏️ DML - Data Manipulation Language

Comandos para manipular os dados.

-- INSERT: inserir dados INSERT INTO cliente (nome, email) VALUES ('João Silva', 'joao@email.com'); -- INSERT múltiplo INSERT INTO produto (nome, preco) VALUES ('Camisa', 49.90), ('Calça', 89.90); -- UPDATE: atualizar dados UPDATE cliente SET telefone = '(11) 99999-9999' WHERE id = 1; -- DELETE: remover dados DELETE FROM cliente WHERE id = 1; -- DELETE com condição DELETE FROM pedido WHERE data_pedido < '2024-01-01';

🔍 DQL - Data Query Language

SELECT - o coração das consultas SQL.

-- Seleção básica SELECT * FROM cliente; SELECT nome, email FROM cliente; -- Filtros WHERE SELECT * FROM produto WHERE preco > 50 AND categoria = 'eletrônicos'; -- Ordenação SELECT nome, preco FROM produto ORDER BY preco DESC; -- Agrupamento SELECT categoria, AVG(preco) as media_preco FROM produto GROUP BY categoria; -- Filtro em grupos (HAVING) SELECT categoria, COUNT(*) as total FROM produto GROUP BY categoria HAVING COUNT(*) > 5;

🔄 JOINs - Combinando Tabelas

-- INNER JOIN: apenas registros correspondentes SELECT c.nome, p.data_pedido, p.valor FROM cliente c INNER JOIN pedido p ON c.id = p.id_cliente; -- LEFT JOIN: todos da esquerda + correspondentes SELECT c.nome, p.id_pedido FROM cliente c LEFT JOIN pedido p ON c.id = p.id_cliente; -- RIGHT JOIN: todos da direita + correspondentes SELECT c.nome, p.id_pedido FROM pedido p RIGHT JOIN cliente c ON c.id = p.id_cliente; -- FULL OUTER JOIN: todos os registros SELECT c.nome, p.id_pedido FROM cliente c FULL OUTER JOIN pedido p ON c.id = p.id_cliente; -- SELF JOIN: tabela relacionada a si mesma SELECT e.nome AS funcionario, g.nome AS gerente FROM funcionario e LEFT JOIN funcionario g ON e.id_gerente = g.id;

📊 Funções de Agregação

-- COUNT: contar registros SELECT COUNT(*) FROM cliente; SELECT COUNT(DISTINCT categoria) FROM produto; -- SUM: somar valores SELECT SUM(valor_total) FROM pedido WHERE YEAR(data_pedido) = 2024; -- AVG: média SELECT AVG(preco) FROM produto WHERE categoria = 'eletrônicos'; -- MIN / MAX: mínimo e máximo SELECT MIN(preco) as menor_preco, MAX(preco) as maior_preco FROM produto; -- Combinação SELECT categoria, COUNT(*) as quantidade, AVG(preco) as media, SUM(estoque) as total_estoque FROM produto GROUP BY categoria;

📝 Subconsultas

Consultas dentro de outras consultas.

-- Subconsulta no WHERE SELECT nome, preco FROM produto WHERE preco > (SELECT AVG(preco) FROM produto); -- Subconsulta com IN SELECT nome FROM cliente WHERE id IN ( SELECT id_cliente FROM pedido WHERE valor_total > 1000 ); -- Subconsulta no SELECT SELECT nome, (SELECT COUNT(*) FROM pedido WHERE id_cliente = cliente.id) as total_pedidos FROM cliente; -- EXISTS SELECT nome FROM cliente c WHERE EXISTS ( SELECT 1 FROM pedido p WHERE p.id_cliente = c.id );

⚖️ Comparativo: SQL vs NoSQL

CaracterísticaSQL (Relacional)NoSQL (Não Relacional)
EsquemaFixos, pré-definidoFlexível, dinâmico
EscalabilidadeVertical (mais hardware)Horizontal (mais nós)
ConsistênciaACID (forte)Eventual (BASE)
LinguagemSQL padrãoCada banco tem sua API
Casos de usoTransações, relatóriosBig data, tempo real
ExemplosMySQL, PostgreSQLMongoDB, Redis, Cassandra

📝 Exercícios de Fixação

1. Modelagem: Sistema de Biblioteca

Modele um sistema de biblioteca com as entidades: LIVRO, USUÁRIO, EMPRÉSTIMO. Defina atributos e relacionamentos.

2. Consulta com JOIN

Escreva uma consulta para listar todos os pedidos com nome do cliente e valor total, ordenados por data decrescente.

3. Funções de Agregação

Calcule o valor total de vendas por categoria de produto, mostrando apenas categorias com vendas acima de R$ 10.000.

4. Subconsulta Correlacionada

Encontre os clientes que já fizeram mais de 3 pedidos.

5. Modelar e Consultar

Crie as tabelas para um sistema de e-commerce simples (Produto, Cliente, Pedido, ItemPedido) e escreva consultas para: a) listar produtos com estoque abaixo de 10, b) total gasto por cliente.

✅ Boas Práticas em SQL

  • ✔️ Use nomes descritivos e consistentes (snake_case)
  • ✔️ Sempre defina PRIMARY KEY e FOREIGN KEY
  • ✔️ Utilize índices em colunas usadas em WHERE/JOIN
  • ✔️ Evite SELECT * em produção
  • ✔️ Use transações quando necessário (BEGIN, COMMIT, ROLLBACK)
  • ✔️ Documente consultas complexas
  • ✔️ Faça backup regularmente

🚀 Dicas de Performance

  • 📌 Índices: aceleram SELECT, mas diminuem INSERT/UPDATE
  • 📌 EXPLAIN: analisa plano de execução da consulta
  • 📌 Evite funções em colunas indexadas no WHERE
  • 📌 Use LIMIT para limitar resultados
  • 📌 Normalize, mas não exagere (desnormalize para performance)
-- Analisar consulta EXPLAIN SELECT * FROM pedido WHERE id_cliente = 10; -- Criar índice para melhorar performance CREATE INDEX idx_pedido_cliente ON pedido(id_cliente);

📚 Referências e Ferramentas

  • SGBDs: MySQL, PostgreSQL, SQLite, SQL Server, Oracle
  • Ferramentas: DBeaver, DataGrip, pgAdmin, MySQL Workbench
  • Documentação: PostgreSQL Docs, MySQL Reference Manual
  • Prática: SQLZoo, HackerRank SQL, LeetCode Database
🎯 Pratique diariamente: resolver problemas de SQL é fundamental para qualquer desenvolvedor.

Nenhum comentário

Tecnologia do Blogger.