Projeto de banco de dados relacional desenvolvido em PostgreSQL para simular o funcionamento básico de uma loja online.
O objetivo é aplicar conceitos de modelagem de dados, criação de tabelas, relacionamentos, inserção de dados fictícios, consultas SQL, análises comerciais e criação de views.
Este projeto tem como finalidade representar a estrutura de um sistema de e-commerce, permitindo o gerenciamento de:
- clientes;
- endereços;
- categorias de produtos;
- produtos;
- pedidos;
- itens dos pedidos;
- pagamentos;
- entregas.
Além da criação do banco, o projeto também inclui consultas para análise de vendas, acompanhamento de pedidos, controle de estoque e geração de relatórios.
- PostgreSQL
- pgAdmin 4
- SQL
loja-online-sql/
│
├── scripts/
│ ├── 01_criacao_tabelas.sql
│ ├── 02_insercao_dados.sql
│ ├── 03_consultas_basicas.sql
│ ├── 04_consultas_com_join.sql
│ ├── 05_consultas_analiticas.sql
│ └── 06_views.sql
│
├── docs/
│ └── modelo_relacional.png
│
└── README.md
| Arquivo | Descrição |
|---|---|
01_criacao_tabelas.sql |
Criação das tabelas, chaves primárias, chaves estrangeiras e restrições |
02_insercao_dados.sql |
Inserção de dados fictícios para testes |
03_consultas_basicas.sql |
Consultas simples com SELECT, WHERE, ORDER BY, BETWEEN, IN, ILIKE, COUNT e LIMIT |
04_consultas_com_join.sql |
Consultas com JOIN, LEFT JOIN, relacionamentos entre tabelas e cálculos de subtotal |
05_consultas_analiticas.sql |
Consultas analíticas com faturamento, ticket médio, produtos mais vendidos e clientes que mais gastaram |
06_views.sql |
Criação de views para relatórios e consultas reutilizáveis |
O banco foi modelado com as seguintes entidades principais:
| Tabela | Função |
|---|---|
clientes |
Armazena os clientes cadastrados |
enderecos |
Armazena os endereços dos clientes |
categorias |
Armazena as categorias dos produtos |
produtos |
Armazena os produtos vendidos pela loja |
pedidos |
Registra os pedidos realizados pelos clientes |
itens_pedido |
Registra os produtos presentes em cada pedido |
pagamentos |
Armazena as informações de pagamento dos pedidos |
entregas |
Armazena as informações de entrega dos pedidos |
O projeto utiliza relacionamentos do tipo um-para-muitos, um-para-um e muitos-para-muitos.
Principais relacionamentos:
- um cliente pode ter vários endereços;
- um cliente pode realizar vários pedidos;
- uma categoria pode possuir vários produtos;
- um pedido pode conter vários itens;
- um produto pode aparecer em vários pedidos;
- um pedido possui um pagamento;
- um pedido possui uma entrega;
- um endereço pode ser usado em várias entregas.
O relacionamento muitos-para-muitos entre pedidos e produtos é resolvido pela tabela intermediária itens_pedido.
clientes 1 --- N enderecos
clientes 1 --- N pedidos
categorias 1 --- N produtos
pedidos 1 --- N itens_pedido
produtos 1 --- N itens_pedido
pedidos 1 --- 1 pagamentos
pedidos 1 --- 1 entregas
enderecos 1 --- N entregas
No PostgreSQL, crie um banco de dados com o nome:
CREATE DATABASE loja_online_db;Depois, selecione esse banco no pgAdmin 4.
Execute os arquivos da pasta scripts/ na seguinte ordem:
1. 01_criacao_tabelas.sql
2. 02_insercao_dados.sql
3. 03_consultas_basicas.sql
4. 04_consultas_com_join.sql
5. 05_consultas_analiticas.sql
6. 06_views.sql
Os dois primeiros scripts criam e populam o banco.
Os demais contêm consultas e views para análise dos dados.
Durante o desenvolvimento do projeto, foram utilizados conceitos como:
- criação de tabelas com
CREATE TABLE; - chaves primárias com
PRIMARY KEY; - chaves estrangeiras com
FOREIGN KEY; - restrições com
NOT NULL,UNIQUE,CHECKeDEFAULT; - inserção de dados com
INSERT INTO; - consultas com
SELECT,WHERE,ORDER BY,BETWEEN,INeILIKE; - junções com
JOINeLEFT JOIN; - agrupamentos com
GROUP BY; - filtros em grupos com
HAVING; - funções agregadas como
COUNT,SUM,AVGeROUND; - manipulação de datas com
DATE_TRUNCeEXTRACT; - criação de views com
CREATE OR REPLACE VIEW.
SELECT
p.id_pedido,
c.nome AS cliente,
p.data_pedido,
p.status_pedido
FROM pedidos p
JOIN clientes c
ON p.id_cliente = c.id_cliente
ORDER BY p.data_pedido ASC;SELECT
p.id_pedido,
c.nome AS cliente,
p.data_pedido,
p.status_pedido,
SUM(ip.quantidade * ip.preco_unitario) AS valor_total
FROM pedidos p
JOIN clientes c
ON p.id_cliente = c.id_cliente
JOIN itens_pedido ip
ON p.id_pedido = ip.id_pedido
GROUP BY
p.id_pedido,
c.nome,
p.data_pedido,
p.status_pedido
ORDER BY p.id_pedido ASC;SELECT
pr.nome AS produto,
SUM(ip.quantidade) AS quantidade_vendida
FROM itens_pedido ip
JOIN produtos pr
ON ip.id_produto = pr.id_produto
JOIN pedidos p
ON ip.id_pedido = p.id_pedido
JOIN pagamentos pg
ON p.id_pedido = pg.id_pedido
WHERE pg.status_pagamento = 'Aprovado'
GROUP BY pr.nome
ORDER BY quantidade_vendida DESC;SELECT
DATE_TRUNC('month', data_pagamento) AS mes,
SUM(valor_pago) AS faturamento_mensal
FROM pagamentos
WHERE status_pagamento = 'Aprovado'
GROUP BY DATE_TRUNC('month', data_pagamento)
ORDER BY mes ASC;O projeto também possui views para facilitar a reutilização de consultas.
| View | Descrição |
|---|---|
vw_resumo_pedidos |
Mostra pedidos com cliente, data, status e valor total |
vw_produtos_categorias |
Mostra produtos com suas categorias |
vw_pedidos_pagamentos |
Mostra pedidos com informações de pagamento |
vw_acompanhamento_entregas |
Mostra entregas com rastreio e endereço completo |
vw_faturamento_produtos |
Mostra faturamento e quantidade vendida por produto |
vw_faturamento_categorias |
Mostra faturamento e quantidade vendida por categoria |
vw_clientes_mais_gastaram |
Mostra os clientes com maior gasto total |
vw_produtos_estoque_baixo |
Lista produtos com estoque baixo |
vw_faturamento_mensal |
Mostra o faturamento mensal da loja |
vw_formas_pagamento |
Mostra uso e faturamento por forma de pagamento |
vw_tempo_entrega_pedidos |
Mostra tempo de entrega por pedido |
vw_resumo_geral_loja |
Exibe indicadores gerais da loja |
SELECT *
FROM vw_resumo_pedidos
ORDER BY id_pedido;SELECT *
FROM vw_faturamento_produtos
ORDER BY faturamento_total DESC;SELECT *
FROM vw_clientes_mais_gastaram
ORDER BY total_gasto DESC;SELECT *
FROM vw_produtos_estoque_baixo
ORDER BY estoque ASC;Algumas melhorias que poderiam ser adicionadas em versões futuras:
- criação de tabela de cupons de desconto;
- controle de frete;
- sistema de avaliações de produtos;
- histórico de alteração de status dos pedidos;
- controle mais detalhado de estoque;
- criação de procedures e functions;
- integração com uma aplicação backend;
- dashboard com gráficos a partir das consultas analíticas.
Este projeto permitiu praticar a criação de um banco de dados relacional completo, desde a modelagem das entidades até a criação de consultas analíticas.
Também foi possível aplicar relacionamentos entre tabelas, restrições de integridade, consultas com múltiplos JOINs, agrupamentos, cálculos de faturamento e criação de views para facilitar relatórios.
Desenvolvido por Pedro Tonon como projeto de estudo e portfólio em SQL/PostgreSQL.