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.