Aula Prática: Banco de Dados Relacionais e SQL

Um guia hands-on para modelagem, criação e manipulação de dados utilizando SQL.

Nível: Iniciante ao Intermediário SGBD Alvo: MySQL / PostgreSQL / SQLite Duração: ~2 Horas

1. Conceitos Fundamentais

Antes de escrever comandos, é fundamental compreender a estrutura de um Banco de Dados Relacional (RDBMS):

Tabela (Relação)

Estrutura bidimensional composta por colunas (atributos) e linhas (registros/tuplas).

Chave Primária (PK)

Identificador único de cada registro em uma tabela. Não pode conter valores nulos ou duplicados.

Chave Estrangeira (FK)

Campo que cria um relacionamento entre duas tabelas, apontando para a PK de outra tabela.

Objetivo da Aula Prática: Criar um sistema de gerenciamento para uma loja virtual composta por Clientes, Categorias, Produtos e Pedidos.

2. Criação do Banco e Estrutura (DDL)

A Linguagem de Definição de Dados (DDL) permite criar e modificar a estrutura do banco.

2.1 Criar o Banco de Dados

-- Criar a base de dados
CREATE DATABASE LojaVirtual;

-- Selecionar a base de dados para uso
USE LojaVirtual;

2.2 Criar as Tabelas com Relacionamentos

-- Tabela 1: Clientes
CREATE TABLE clientes (
    id_cliente INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    data_cadastro DATE DEFAULT CURRENT_DATE
);

-- Tabela 2: Categorias
CREATE TABLE categorias (
    id_categoria INT PRIMARY KEY AUTO_INCREMENT,
    nome_categoria VARCHAR(50) NOT NULL
);

-- Tabela 3: Produtos (Com FK para Categorias)
CREATE TABLE produtos (
    id_produto INT PRIMARY KEY AUTO_INCREMENT,
    nome_produto VARCHAR(100) NOT NULL,
    preco DECIMAL(10, 2) NOT NULL,
    estoque INT DEFAULT 0,
    id_categoria INT,
    FOREIGN KEY (id_categoria) REFERENCES categorias(id_categoria)
);

-- Tabela 4: Pedidos (Com FK para Clientes)
CREATE TABLE pedidos (
    id_pedido INT PRIMARY KEY AUTO_INCREMENT,
    id_cliente INT,
    data_pedido DATETIME DEFAULT CURRENT_TIMESTAMP,
    total DECIMAL(10, 2),
    FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
);

3. Inserção e Manipulação de Dados (DML)

A Linguagem de Manipulação de Dados (DML) lida com a inclusão, alteração e remoção de registros.

3.1 Inserir Dados (INSERT)

-- Inserindo Categorias
INSERT INTO categorias (nome_categoria) VALUES 
('Eletrônicos'),
('Periféricos'),
('Livros');

-- Inserindo Clientes
INSERT INTO clientes (nome, email) VALUES 
('Ana Silva', 'ana@email.com'),
('Carlos Souza', 'carlos@email.com'),
('Beatriz Lima', 'beatriz@email.com');

-- Inserindo Produtos
INSERT INTO produtos (nome_produto, preco, estoque, id_categoria) VALUES 
('Smartphone X', 2500.00, 15, 1),
('Teclado Mecânico', 350.50, 30, 2),
('Mouse Sem Fio', 120.00, 50, 2),
('Livro de SQL', 89.90, 100, 3);

-- Inserindo Pedidos
INSERT INTO pedidos (id_cliente, total) VALUES 
(1, 2850.50),
(2, 120.00),
(1, 89.90);

3.2 Atualizar Dados (UPDATE)

-- Aplicando 10% de desconto nos produtos da categoria Eletrônicos (id 1)
UPDATE produtos 
SET preco = preco * 0.90 
WHERE id_categoria = 1;

3.3 Remover Dados (DELETE)

-- Deletando um produto específico mantendo a integridade
DELETE FROM produtos 
WHERE id_produto = 3;

4. Consultas e Agregações (DQL)

4.1 Consultas Básicas com Filtros

-- Listar produtos com preço maior que 200 reais ordenados pelo preço
SELECT nome_produto, preco 
FROM produtos 
WHERE preco > 200.00 
ORDER BY preco DESC;

4.2 Junção de Tabelas (INNER JOIN)

Combine dados de múltiplas tabelas usando as chaves estrangeiras:

-- Listar produtos juntamente com os nomes de suas categorias
SELECT 
    p.nome_produto, 
    p.preco, 
    c.nome_categoria 
FROM produtos p
INNER JOIN categorias c ON p.id_categoria = c.id_categoria;

4.3 Agrupamento e Funções de Agregação

-- Calcular o total gasto por cada cliente
SELECT 
    c.nome, 
    COUNT(p.id_pedido) AS total_pedidos,
    SUM(p.total) AS valor_total_gasto
FROM clientes c
LEFT JOIN pedidos p ON c.id_cliente = p.id_cliente
GROUP BY c.id_cliente, c.nome;

5. Exercício Prático Proposto

Resolva os desafios abaixo para consolidar o aprendizado:

  1. Escreva uma consulta que retorne todos os clientes cadastrados que ainda não fizeram nenhum pedido.
  2. Crie um comando SQL para aumentar em 5 unidades o estoque de todos os produtos com preço inferior a R$ 100,00.
  3. Escreva uma consulta usando INNER JOIN e GROUP BY que mostre a quantidade de produtos cadastrados por categoria.