Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

SQL: INSERT, SELECT e JOIN

Com as tabelas criadas, podemos manipular dados. SQL tem quatro operações fundamentais — INSERT, SELECT, UPDATE e DELETE — mas nesse capítulo usamos apenas INSERT e SELECT. Escrita e modificação ficam para quando o TamoJunto precisar delas.

Inserindo dados

O comando INSERT adiciona registros a uma tabela. Como events agora tem um foreign key que referencia users, precisamos inserir os usuários primeiro:

INSERT INTO users (name, email) VALUES
    ('Ana Silva',    'ana@email.com'),
    ('Bruno Costa',  'bruno@email.com'),
    ('Carla Souza',  'carla@email.com');

A coluna id não aparece no INSERT — o SERIAL gera o valor automaticamente. O mesmo vale para created_at, que usa DEFAULT NOW().

Com os usuários criados, podemos inserir eventos. O organizer_id precisa ser o id de um usuário existente — aqui, usamos 1 (Ana), 2 (Bruno) e 3 (Carla):

INSERT INTO events (title, description, location, date, capacity, organizer_id)
VALUES
    ('Hackathon UFS',
     'Maratona de programação de 24h',
     'Centro de Vivência - UFS',
     '2026-09-15 08:00:00',
     50,
     1),
    ('Meetup de TypeScript',
     'Palestra sobre tipos avançados em TS',
     'Auditório do DCOMP',
     '2026-09-20 19:00:00',
     30,
     2);

E se tentarmos inserir um evento com organizer_id = 99?

$ psql postgres://localhost:5432/tamojunto -c \
    "INSERT INTO events (title, location, date, capacity, organizer_id) \
     VALUES ('Evento Fantasma', 'Lugar Nenhum', '2026-12-01', 10, 99);"
ERROR:  insert or update on table "events" violates foreign key constraint
        "events_organizer_id_fkey"
DETAIL:  Key (organizer_id)=(99) is not present in table "users".

O banco rejeitou a operação. O foreign key está fazendo seu trabalho.

Consultando dados

O comando SELECT recupera dados de uma tabela:

SELECT id, title, date, capacity FROM events;
 id |        title         |        date         | capacity
----+----------------------+---------------------+----------
  1 | Hackathon UFS        | 2026-09-15 08:00:00 |       50
  2 | Meetup de TypeScript | 2026-09-20 19:00:00 |       30
(2 rows)

O SELECT * retorna todas as colunas, mas listar as colunas explicitamente é melhor: deixa claro quais dados o código espera e evita surpresas quando alguém adiciona uma coluna nova à tabela.

Filtrar registros usa a cláusula WHERE:

SELECT title, capacity FROM events WHERE capacity >= 40;
     title     | capacity
---------------+----------
 Hackathon UFS |       50
(1 row)

JOIN: cruzando tabelas

O SELECT acima mostra organizer_id = 1, mas isso não diz muita coisa. Para obter o nome do organizador junto com os dados do evento, precisamos cruzar as tabelas events e users. Isso é um JOIN:

SELECT
    e.title,
    e.date,
    e.capacity,
    u.name AS organizer_name
FROM events e
JOIN users u ON e.organizer_id = u.id;
        title         |        date         | capacity | organizer_name
----------------------+---------------------+----------+----------------
 Hackathon UFS        | 2026-09-15 08:00:00 |       50 | Ana Silva
 Meetup de TypeScript | 2026-09-20 19:00:00 |       30 | Bruno Costa
(2 rows)

A cláusula JOIN users u ON e.organizer_id = u.id diz ao banco: “para cada evento, encontre o usuário cujo id é igual ao organizer_id do evento e junte os dados numa única linha”. Os aliases e e u são atalhos para evitar escrever o nome completo da tabela em cada coluna.