10.5.5 - JOIN - Conectando as Investigações

Até agora, você já sabe como investigar (SELECT), adicionar (INSERT), modificar (UPDATE) e apagar (DELETE) dados em uma tabela por vez. Mas, lembra que a grande força dos bancos de dados relacionais está nas conexões entre as tabelas, feitas pelas Chaves Estrangeiras (FKs)?

Imagine que você quer ver um post e o nome do usuário que o escreveu. Sem o poder dos JOINs, você teria que fazer duas buscas separadas:

  1. Buscar o texto do post e o ID do usuário:

sqlCopiarEditarSELECT texto_do_post, usuario_id FROM posts WHERE id = 'e5f6g7h8...';
  1. Depois, usar o ID para buscar o nome do usuário:

sqlCopiarEditarSELECT nome FROM usuarios WHERE id = 'z9y8x7w6...';

Funciona, mas que trabalheira! 🥵 E se precisarmos fazer isso para 100 posts? Teríamos que rodar 101 consultas!

É aí que o JOIN entra em ação. Ele é o superpoder que permite combinar linhas de duas ou mais tabelas em uma única consulta, ligando as informações por colunas relacionadas, geralmente a combinação da Chave Estrangeira (FK) com a Chave Primária (PK).

Pense no JOIN como juntar peças de quebra-cabeças que se encaixam perfeitamente.


A Missão: Unir Forças das Tabelas com INNER JOIN

O tipo de JOIN mais comum — e o que vamos focar — é o INNER JOIN. Ele une duas tabelas e só traz as linhas que têm correspondência em ambas.

A sintaxe secreta do INNER JOIN:

sqlCopiarEditarSELECT tabela1.colunaA, tabela1.colunaB, tabela2.colunaX, tabela2.colunaY
FROM tabela1
INNER JOIN tabela2 ON tabela1.coluna_chave_fk = tabela2.coluna_chave_pk;

Explicando cada parte:

  • SELECT tabela1.colunaA, ...: você escolhe as colunas para exibir. Como agora temos duas tabelas, especifique sempre nome_tabela.nome_coluna para evitar confusão.

  • FROM tabela1: a tabela principal da consulta.

  • INNER JOIN tabela2: tabela que será combinada com a primeira.

  • ON tabela1.coluna_chave_fk = tabela2.coluna_chave_pk: a condição que define como as tabelas se conectam, normalmente a FK igualando a PK.

Na prática, o banco percorre cada linha da tabela1, procura uma linha na tabela2 onde os valores da chave batem, e combina os dados. Se não achar correspondência, aquela linha não aparece no resultado.


Exemplo Prático: Posts e Nomes dos Autores

Temos duas tabelas simplificadas:

usuarios

id (PK)
nome

f47ac10b...

João Silva

z9y8x7w6...

Maria Souza

b2c3d4e5...

Ana Lima

posts

id (PK)
texto_do_post
usuario_id (FK)

e5f6g7h8...

"Aprendendo Supabase!"

z9y8x7w6...

i9j0k1l2...

"Adorei o capítulo 5"

f47ac10b...

m3n4o5p6...

"Cheguei na área!"

b2c3d4e5...

q7r8s9t0...

"SQL é demais!"

f47ac10b...

Query mágica para juntar post e nome do autor:

sqlCopiarEditarSELECT
  posts.texto_do_post,
  usuarios.nome
FROM posts
INNER JOIN usuarios ON posts.usuario_id = usuarios.id;

Resultado:

texto_do_post
nome

"Aprendendo Supabase!"

Maria Souza

"Adorei o capítulo 5"

João Silva

"Cheguei na área!"

Ana Lima

"SQL é demais!"

João Silva

Perceba que o nome do João aparece duas vezes, corretamente associado aos posts dele.

Se algum usuário não tiver post, ele não aparecerá — pois o INNER JOIN só traz quem tem correspondência nos dois lados.


Tornando o Código Mais Limpo: Apelidos (Aliases)

Em vez de digitar nome_tabela.coluna toda hora, podemos usar apelidos para as tabelas:

sqlCopiarEditarSELECT
  p.texto_do_post,
  u.nome
FROM posts AS p
INNER JOIN usuarios AS u ON p.usuario_id = u.id;

p é o apelido para posts e u para usuarios. O AS é opcional, e essa prática deixa o código mais legível e fácil de escrever.


Filtrando com JOIN e WHERE

Você pode combinar o poder do JOIN com filtros WHERE. Por exemplo, para ver só os posts do João Silva:

sqlCopiarEditarSELECT
  p.texto_do_post,
  u.nome
FROM posts AS p
INNER JOIN usuarios AS u ON p.usuario_id = u.id
WHERE u.nome = 'João Silva';

Juntando Mais de Duas Tabelas

Quer ir além? Pode encadear vários JOINs para unir várias tabelas. Imagine uma tabela comentarios com comentários, ligada a posts e usuários:

sqlCopiarEditarSELECT
  c.texto_comentario,
  p.texto_do_post,
  u.nome AS nome_autor_comentario
FROM comentarios AS c
INNER JOIN posts AS p ON c.post_id = p.id
INNER JOIN usuarios AS u ON c.usuario_id = u.id;

Aqui, juntamos comentarios com posts, e o resultado com usuarios, cruzando as informações de forma integrada.


Outros Tipos de JOIN (Bônus)

  • LEFT JOIN: traz todas as linhas da tabela da esquerda e as correspondentes da direita. Se não houver correspondência na direita, os campos dela vêm como NULL.

  • RIGHT JOIN: o inverso do LEFT JOIN, trazendo tudo da direita e o que combinar da esquerda.

  • FULL OUTER JOIN: traz tudo das duas tabelas, preenchendo com NULL onde não houver correspondência.

Por enquanto, foque no INNER JOIN, o mais usado do dia a dia.


No próximo módulo, vamos explorar as Constraints, que garantem a integridade e qualidade dos dados, como NOT NULL, UNIQUE e as regras das Chaves Estrangeiras.

Last updated