2

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!

✅ Sem pressa ✅ Exemplos práticos ✅ Exercícios guiados

Objetivos de Aprendizagem

  • Entender completamente a estrutura de uma tabela (linhas e colunas)
  • Dominar todos os tipos de dados do PostgreSQL com exemplos práticos
  • Criar tabelas usando o comando CREATE TABLE passo a passo
  • Aplicar todas as restrições e validações nos dados
  • Praticar com exercícios reais no Supabase
  • Entender quando usar cada tipo de dado
  • Evitar erros comuns na criação de tabelas
  • Planejar a estrutura de dados para projetos reais
  • Pré-requisitos

    Materiais de Apoio

    Ferramentas Necessárias:

    • • Navegador web atualizado
    • • Conta no Supabase (gratuita)
    • • Bloco de notas para anotações

    Links Úteis:

    1

    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:

    CHECK

    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

    1

    Acesse seu projeto no Supabase

    Entre em supabase.com e clique no seu projeto

    2

    Vá para o SQL Editor

    No menu lateral, clique em "SQL Editor" (ícone de código)

    3

    Digite o comando CREATE TABLE

    Cole o código SQL na área de texto e clique em "Run" (botão azul)

    4

    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:

    1
    id SERIAL PRIMARY KEY

    Cria um ID único que aumenta automaticamente (1, 2, 3...)

    2
    nome VARCHAR(100) NOT NULL

    Nome do produto (até 100 caracteres, obrigatório)

    3
    descricao TEXT

    Descrição detalhada (texto longo, opcional)

    4
    preco DECIMAL(10,2) NOT NULL

    Preço com até 8 dígitos antes da vírgula e 2 depois (ex: 12345678.99)

    5
    em_estoque BOOLEAN DEFAULT true

    Se o produto está disponível (padrão: sim)

    6
    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:

    CREATE TABLE nome_tabela (
    coluna1 TIPO RESTRIÇÃO,
    coluna2 TIPO RESTRIÇÃO
    );

    📊 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)
    Aula Anterior: Introdução Próxima Aula: Inserindo Dados