Criando Suas Primeiras Tabelas (Passo a Passo)
Fundamentos • 2-4 horas • Iniciante Absoluto
🎯 O que você vai conseguir fazer hoje:
Criar suas próprias tabelas no Supabase, entender completamente como organizar informações e escolher os tipos certos para cada dado. Tudo explicado de forma muito simples, como se você nunca tivesse visto um banco de dados na vida!
Objetivos de Aprendizagem
Pré-requisitos
- Ter completado a Aula 1 (Introdução ao SQL e Supabase)
- Ter uma conta no Supabase configurada
- Conhecimento básico de como navegar no painel do Supabase
Materiais de Apoio
Ferramentas Necessárias:
- • Navegador web atualizado
- • Conta no Supabase (gratuita)
- • Bloco de notas para anotações
Links Úteis:
Estrutura de uma Tabela (45 minutos)
🎯 O que você vai aprender nesta seção:
- • Como uma tabela é organizada (conceito fundamental)
- • A diferença entre colunas e linhas com exemplos práticos
- • Como planejar a estrutura de uma tabela
- • Exercícios práticos para fixar o conceito
💡 Analogia Simples: Tabela = Agenda Telefônica
Imagine uma agenda telefônica antiga. Ela tem colunas para diferentes informações (Nome, Telefone, Endereço) e cada linha representa uma pessoa diferente.
| Nome | Telefone | Endereço |
|---|---|---|
| João Silva | (11) 99999-9999 | Rua A, 123 |
| Maria Santos | (11) 88888-8888 | Rua B, 456 |
No banco de dados é exatamente igual! Cada coluna guarda um tipo específico de informação, e cada linha representa um registro completo.
📚 Conceitos Fundamentais
Colunas (Campos)
- • Definem que tipo de informação será armazenada
- • Cada coluna tem um nome único
- • Cada coluna tem um tipo de dado específico
- • Exemplos: id, nome, email, data_nascimento
Linhas (Registros)
- • Contêm os dados reais
- • Cada linha representa um item específico
- • Uma linha = um registro completo
- • Exemplos: um cliente, um produto, um pedido
🏪 Exemplo Prático: Loja de Eletrônicos
Cenário:
Você tem uma loja de eletrônicos e precisa organizar informações sobre seus produtos. Vamos criar uma tabela chamada "produtos":
| id | nome | preco | categoria | em_estoque |
|---|---|---|---|---|
| 1 | Notebook Dell Inspiron | R$ 2.500,00 | Computadores | Sim |
| 2 | Mouse Wireless Logitech | R$ 45,90 | Acessórios | Não |
| 3 | Smartphone Samsung Galaxy | R$ 1.200,00 | Celulares | Sim |
🔍 Analisando cada parte da tabela:
📋 Colunas (O que cada uma guarda):
- id: Número único para identificar cada produto
- nome: Nome completo do produto
- preco: Valor de venda em reais
- categoria: Tipo/grupo do produto
- em_estoque: Se está disponível ou não
📝 Linhas (Cada produto):
- Linha 1: Notebook Dell (ID 1)
- Linha 2: Mouse Logitech (ID 2)
- Linha 3: Samsung Galaxy (ID 3)
- Cada linha = um produto completo
💭 Exercício de Reflexão (5 minutos)
Imagine que você precisa criar uma tabela para uma escola guardar informações dos alunos. Que colunas você criaria?
🤔 Pense em:
- • Que informações são essenciais?
- • Como identificar cada aluno?
- • Que dados a escola precisa?
💡 Possíveis colunas:
- • id (número único)
- • nome_completo
- • data_nascimento
- • serie_ano
- • email_responsavel
✅ Checkpoint: O que você aprendeu
Conceitos dominados:
- ✓ Tabela = estrutura organizada de dados
- ✓ Colunas = tipos de informação
- ✓ Linhas = registros individuais
- ✓ Cada coluna tem nome e tipo específico
Próximos passos:
- → Aprender sobre tipos de dados
- → Entender como criar tabelas
- → Praticar com exemplos reais
- → Aplicar restrições nos dados
🔧 Exercício de Fixação 1: Conceitos Básicos
Vamos testar seu entendimento sobre os conceitos fundamentais de tabelas!
1. O que é uma tabela em banco de dados?
2. Qual a diferença entre linha e coluna?
3. Por que usamos bancos de dados ao invés de planilhas?
Section 2: Tipos de Dados no PostgreSQL
⏱️ Duração: 60 minutos | 🎯 Conceito: Escolhendo o tipo certo para cada informação
💡 O que são Tipos de Dados?
Imagine que você está organizando uma gaveta. Você não colocaria meias junto com pratos, certo? Da mesma forma, no banco de dados, cada coluna precisa "saber" que tipo de informação vai receber.
🔍 Analogia: Gavetas Organizadas
- Gaveta de números: Só aceita valores como 1, 100, 25.50
- Gaveta de textos: Só aceita palavras como "João", "Produto A"
- Gaveta de datas: Só aceita datas como "2024-03-15"
- Gaveta de verdadeiro/falso: Só aceita "sim" ou "não"
⚠️ Por que Escolher o Tipo Correto é Importante?
✅ Benefícios:
- • Economia de espaço no servidor
- • Consultas mais rápidas
- • Validação automática dos dados
- • Prevenção de erros
❌ Problemas de escolha errada:
- • Desperdício de memória
- • Lentidão nas consultas
- • Dados inconsistentes
- • Dificuldade para fazer cálculos
📚 Guia Completo dos Tipos de Dados
Vamos conhecer cada tipo de dado disponível no PostgreSQL, com exemplos práticos de quando usar cada um.
1. Tipos Numéricos - Para Números e Cálculos
🎯 Quando usar: Para idades, preços, quantidades, IDs, contadores
INTEGER
Números inteiros
O que é: Números sem vírgula (positivos, negativos ou zero)
✅ Exemplos corretos:
- • Idade: 25, 30, 18
- • Quantidade: 10, 100, 0
- • Ano: 2024, 1990
❌ Não use para:
- • Preços: 19.99 ❌
- • Peso: 75.5 ❌
- • Porcentagem: 15.5% ❌
DECIMAL(10,2)
Números com vírgula
O que é: Números com casas decimais. O (10,2) significa: até 10 dígitos total, sendo 2 após a vírgula
💡 Dica: DECIMAL(10,2) = até 99.999.999,99
✅ Perfeito para:
- • Preços: 19.99, 1500.50
- • Salários: 3500.00
- • Peso: 75.5, 1.2
🔧 Variações:
- • DECIMAL(8,2) - preços menores
- • DECIMAL(15,4) - mais precisão
- • DECIMAL(5,0) - como INTEGER
SERIAL
Contador automático
O que é: Número que aumenta sozinho a cada novo registro (1, 2, 3, 4...)
🎯 Uso principal: IDs únicos para identificar cada registro
✅ Como funciona:
- • 1º registro: id = 1
- • 2º registro: id = 2
- • 3º registro: id = 3
- • Automático, você não digita!
💡 Sempre use para:
- • ID de produtos
- • ID de clientes
- • ID de pedidos
- • Qualquer identificador único
2. Tipos de Texto - Para Palavras e Frases
🎯 Quando usar: Para nomes, descrições, endereços, comentários, códigos
VARCHAR(50)
Texto com limite
O que é: Texto que pode ter até X caracteres. O número entre parênteses é o limite máximo.
💡 Dica: VARCHAR(50) = até 50 letras/números/símbolos
✅ Perfeito para:
- • Nomes: VARCHAR(100)
- • E-mails: VARCHAR(150)
- • Títulos: VARCHAR(200)
- • Endereços: VARCHAR(300)
🔧 Como escolher o tamanho:
- • Nome: 50-100 caracteres
- • E-mail: 100-150 caracteres
- • Telefone: 15-20 caracteres
- • CEP: 10 caracteres
TEXT
Texto sem limite
O que é: Texto que pode ser muito longo, sem limite definido. Use quando não souber o tamanho.
🎯 Uso principal: Textos longos e variáveis
✅ Ideal para:
- • Descrições de produtos
- • Comentários de clientes
- • Conteúdo de artigos
- • Observações gerais
⚠️ Cuidado:
- • Usa mais memória
- • Mais lento que VARCHAR
- • Use só quando necessário
- • Prefira VARCHAR quando possível
CHAR(2)
Texto fixo
O que é: Texto que SEMPRE tem o mesmo tamanho. Se for menor, completa com espaços.
💡 Exemplo: CHAR(2) para "SP" sempre ocupa 2 caracteres
✅ Perfeito para:
- • Estados: CHAR(2) → "SP", "RJ"
- • Códigos: CHAR(3) → "001", "ABC"
- • Siglas: CHAR(4) → "CNPJ"
- • Flags: CHAR(1) → "S", "N"
❌ Não use para:
- • Nomes (tamanho varia)
- • E-mails (tamanho varia)
- • Descrições (tamanho varia)
- • Qualquer texto variável
3. Tipos de Data e Hora - Para Datas e Horários
🎯 Quando usar: Para nascimentos, cadastros, agendamentos, histórico
DATE
Apenas data
O que é: Apenas a data, sem horário. Formato: AAAA-MM-DD
💡 Formato: 2024-03-15 (ano-mês-dia)
✅ Perfeito para:
- • Data de nascimento
- • Data de cadastro
- • Vencimentos
- • Feriados
📝 Exemplos:
- • 2024-12-25 (Natal)
- • 1990-05-15 (nascimento)
- • 2024-01-01 (Ano Novo)
TIMESTAMP
Data + hora
O que é: Data completa com horário exato. Formato: AAAA-MM-DD HH:MM:SS
🎯 Uso principal: Quando você precisa saber o momento exato
✅ Ideal para:
- • Momento do pedido
- • Último login
- • Criação de posts
- • Logs do sistema
📝 Exemplos:
- • 2024-03-15 14:30:25
- • 2024-12-25 00:00:00
- • 2024-01-01 23:59:59
4. Outros Tipos Importantes - Casos Especiais
🎯 Quando usar: Para sim/não, dados estruturados, casos específicos
BOOLEAN
Verdadeiro/Falso
O que é: Só aceita dois valores: verdadeiro (true) ou falso (false)
💡 Valores: true, false, 1, 0, 'sim', 'não'
✅ Perfeito para:
- • Produto ativo: true/false
- • Cliente VIP: true/false
- • E-mail confirmado: true/false
- • Aceita newsletter: true/false
📝 Exemplos práticos:
- • ativo BOOLEAN DEFAULT true
- • vip BOOLEAN DEFAULT false
- • confirmado BOOLEAN
JSON
Dados estruturados
O que é: Armazena dados organizados em formato JSON (chave: valor)
⚠️ Avançado: Use apenas quando necessário, é mais complexo
✅ Útil para:
- • Configurações flexíveis
- • Dados variáveis
- • Metadados
- • APIs externas
📝 Exemplo:
{"cor": "azul", "tamanho": "M"}
🏋️ Exercício Prático: Escolhendo o Tipo Certo
Para cada informação abaixo, escolha o tipo de dado mais adequado:
1. Idade de uma pessoa
2. Preço de um produto
3. Nome completo
4. Estado (SP, RJ, MG)
5. Data de nascimento
6. Cliente ativo (sim/não)
🧠 Exercício de Fixação 2: Tipos de Dados
Teste seus conhecimentos sobre tipos de dados no PostgreSQL:
1. Qual tipo de dado é mais adequado para armazenar um CPF (11 dígitos)?
2. Para armazenar o salário de um funcionário com centavos, qual tipo usar?
3. Qual a diferença entre VARCHAR(50) e CHAR(50)?
Comando CREATE TABLE
O comando CREATE TABLE é usado para criar uma nova tabela. Vamos ver a sintaxe básica:
CREATE TABLE nome_da_tabela (
coluna1 TIPO_DADO RESTRIÇÕES,
coluna2 TIPO_DADO RESTRIÇÕES,
coluna3 TIPO_DADO RESTRIÇÕES
);
Exemplo Prático: Tabela de Produtos
CREATE TABLE produtos (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
preco DECIMAL(10,2) NOT NULL,
categoria VARCHAR(50),
em_estoque BOOLEAN DEFAULT true,
data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Explicação linha por linha:
- id SERIAL PRIMARY KEY: Número único que aumenta automaticamente
- nome VARCHAR(100) NOT NULL: Texto até 100 caracteres, obrigatório
- preco DECIMAL(10,2) NOT NULL: Número com 2 casas decimais, obrigatório
- categoria VARCHAR(50): Texto até 50 caracteres, opcional
- em_estoque BOOLEAN DEFAULT true: Verdadeiro/falso, padrão é verdadeiro
- data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP: Data/hora atual automaticamente
Section 4: Restrições e Validações (30 minutos)
🛡️ Protegendo Seus Dados
As restrições são como regras de segurança que garantem que apenas dados válidos sejam inseridos na sua tabela. É como ter um porteiro que verifica se tudo está correto antes de deixar entrar!
Por que Usar Restrições?
✅ Benefícios:
- • Evita dados inválidos (ex: idade negativa)
- • Garante informações obrigatórias
- • Previne duplicatas indesejadas
- • Mantém a qualidade dos dados
❌ Sem Restrições:
- • Dados inconsistentes
- • Informações em branco
- • Emails duplicados
- • Valores impossíveis
Guia Completo das Restrições
1. NOT NULL - Campo Obrigatório
Garante que o campo sempre tenha um valor. É como marcar um campo como "obrigatório" em um formulário.
nome VARCHAR(100) NOT NULL
✅ Permitido:
"João Silva", "Maria"
❌ Rejeitado:
NULL, vazio, sem valor
2. PRIMARY KEY - Identificador Único
Cria um identificador único para cada linha. É como o RG de uma pessoa - cada um tem o seu e não pode repetir.
id SERIAL PRIMARY KEY
💡 Dica:
SERIAL cria números automáticos (1, 2, 3...) e PRIMARY KEY garante que sejam únicos.
3. UNIQUE - Valor Único na Tabela
Impede valores duplicados. Perfeito para emails, CPFs, ou qualquer coisa que deve ser única.
email VARCHAR(150) UNIQUE
✅ Primeiro email:
"joao@email.com"
❌ Segundo igual:
"joao@email.com" (rejeitado!)
4. DEFAULT - Valor Padrão
Define um valor automático quando nada é informado. É como ter uma resposta padrão já preenchida.
ativo BOOLEAN DEFAULT true
🔧 Como funciona:
Se você não informar se o cliente está ativo, automaticamente será marcado como "true" (ativo).
5. CHECK - Validação Customizada
Cria regras personalizadas. É como ter um fiscal que verifica se o valor faz sentido.
idade INTEGER CHECK (idade >= 0 AND idade <= 120)
✅ Idades válidas:
0, 25, 65, 120
❌ Idades inválidas:
-5, 150, 999
6. FOREIGN KEY - Referência a Outra Tabela
Conecta tabelas entre si. É como ter um endereço que aponta para outra casa. (Veremos em detalhes na Aula 7)
categoria_id INTEGER REFERENCES categorias(id)
🔗 Exemplo:
Um produto só pode ter uma categoria que realmente existe na tabela de categorias.
Exercício: Identificando Restrições
Para cada situação abaixo, escolha a restrição mais adequada:
Validação customizada
idade INTEGER CHECK (idade >= 0)
FOREIGN KEY
Referência a outra tabela (veremos na aula 5)
categoria_id INTEGER REFERENCES categorias(id)
Section 3: Comando CREATE TABLE (45 minutos)
🏗️ Construindo Nossa Primeira Tabela
Agora que entendemos os tipos de dados, vamos aprender a criar tabelas no Supabase. É como construir uma casa - precisamos de um projeto (estrutura) antes de começar!
Onde Executar os Comandos SQL no Supabase
Acesse seu projeto no Supabase
Entre em supabase.com e clique no seu projeto
Vá para o SQL Editor
No menu lateral, clique em "SQL Editor" (ícone de código)
Digite o comando CREATE TABLE
Cole o código SQL na área de texto e clique em "Run" (botão azul)
Verifique se funcionou
Vá em "Table Editor" para ver sua nova tabela criada
Sintaxe Básica do CREATE TABLE
CREATE TABLE nome_da_tabela (
coluna1 TIPO_DE_DADO restrições,
coluna2 TIPO_DE_DADO restrições,
coluna3 TIPO_DE_DADO restrições
);
⚠️ Regras Importantes:
- • Nome da tabela em minúsculas
- • Use underscore (_) em vez de espaços
- • Cada linha termina com vírgula (exceto a última)
- • Não esqueça do ponto e vírgula (;) no final
✅ Boas Práticas:
- • Sempre tenha uma coluna ID
- • Use nomes descritivos para colunas
- • Defina restrições apropriadas
- • Documente sua estrutura
Exemplo Prático: Tabela de Produtos
Vamos criar uma tabela para uma loja online. Imagine que precisamos armazenar informações sobre produtos:
CREATE TABLE produtos (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
descricao TEXT,
preco DECIMAL(10,2) NOT NULL,
categoria VARCHAR(50),
em_estoque BOOLEAN DEFAULT true,
data_criacao TIMESTAMP DEFAULT NOW()
);
📝 Explicação Linha por Linha:
id SERIAL PRIMARY KEY
Cria um ID único que aumenta automaticamente (1, 2, 3...)
nome VARCHAR(100) NOT NULL
Nome do produto (até 100 caracteres, obrigatório)
descricao TEXT
Descrição detalhada (texto longo, opcional)
preco DECIMAL(10,2) NOT NULL
Preço com até 8 dígitos antes da vírgula e 2 depois (ex: 12345678.99)
em_estoque BOOLEAN DEFAULT true
Se o produto está disponível (padrão: sim)
data_criacao TIMESTAMP DEFAULT NOW()
Data e hora de criação (preenchida automaticamente)
Exercício Prático: Tabela de Clientes
Agora é sua vez! Complete o código SQL abaixo para criar uma tabela que armazene informações de clientes de uma loja:
CREATE TABLE clientes (
id _______ PRIMARY KEY,
nome _______(100) NOT NULL,
email _______(150) UNIQUE NOT NULL,
telefone _______(20),
data_nascimento _______,
ativo _______ DEFAULT true
);
🛠️ Exercício Hands-On: Crie sua Própria Tabela
Agora você vai criar uma tabela completa do zero! Imagine que você está desenvolvendo um sistema para uma escola e precisa criar uma tabela para armazenar informações dos estudantes.
📋 Requisitos da Tabela "estudantes":
- • ID: Número único que aumenta automaticamente
- • Nome completo: Texto até 150 caracteres (obrigatório)
- • Email: Texto até 100 caracteres (único e obrigatório)
- • Idade: Número inteiro
- • Curso: Texto até 80 caracteres
- • Ativo: Verdadeiro/Falso (padrão: verdadeiro)
- • Data de matrícula: Data e hora (padrão: agora)
Exercício de Fixação 3: CREATE TABLE
Teste seus conhecimentos sobre criação de tabelas:
1. Qual comando é usado para criar uma nova tabela?
2. O que significa SERIAL em PostgreSQL?
3. Qual restrição garante que uma coluna não pode ter valores duplicados?
Section 5: Exercício Final e Revisão (30 minutos)
🎯 Desafio Final: Criando uma Loja Online
Vamos criar as tabelas principais de uma loja online. Use tudo que aprendeu!
📋 Requisitos:
- • Tabela de produtos com: id, nome, descrição, preço, categoria, em_estoque
- • Tabela de categorias com: id, nome, descrição
- • Use os tipos de dados corretos
- • Aplique as restrições adequadas
Tabela: categorias
Tabela: produtos
📚 Resumo da Aula - O que Você Aprendeu
🎯 Conceitos Principais:
- Tabelas são estruturas com colunas (campos) e linhas (registros)
- Cada coluna tem um tipo de dado específico (INTEGER, VARCHAR, DATE, etc.)
- CREATE TABLE é usado para criar novas tabelas
- Restrições garantem a qualidade dos dados
🛠️ Comandos Aprendidos:
📊 Próximos Passos:
- • Aula 3: Inserir dados nas tabelas (INSERT)
- • Aula 4: Consultar dados (SELECT)
- • Aula 5: Filtrar resultados (WHERE)
💡 Dica para Casa:
Pratique criando tabelas para diferentes cenários: biblioteca, escola, restaurante. Pense nos campos necessários e seus tipos!
🎯 Quiz Final - Teste Seus Conhecimentos
Responda às perguntas abaixo para verificar se você domina os conceitos desta aula!
1. Qual tipo de dados você usaria para armazenar o preço de um produto?
2. Qual restrição garante que um campo não pode ficar vazio?
3. Complete o comando: CREATE _____ produtos (...)
4. Qual restrição impede valores duplicados em uma coluna?
5. Para armazenar uma descrição longa de produto, qual tipo usar?
🚀 Desafio Bônus: Crie Sua Própria Tabela
Agora é sua vez! Crie uma tabela para um sistema de biblioteca.
📚 Tabela: livros
A tabela deve ter as seguintes colunas:
- id: Identificador único (número inteiro, chave primária)
- titulo: Nome do livro (texto até 200 caracteres, obrigatório)
- autor: Nome do autor (texto até 100 caracteres, obrigatório)
- isbn: Código ISBN (texto único de 13 caracteres)
- preco: Preço do livro (decimal com 2 casas, deve ser positivo)
- disponivel: Se está disponível (verdadeiro/falso, padrão: verdadeiro)