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 JOIN
s, você teria que fazer duas buscas separadas:
Buscar o texto do post e o ID do usuário:
sqlCopiarEditarSELECT texto_do_post, usuario_id FROM posts WHERE id = 'e5f6g7h8...';
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
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 semprenome_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
f47ac10b...
João Silva
z9y8x7w6...
Maria Souza
b2c3d4e5...
Ana Lima
posts
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:
"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 JOIN
s 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 comoNULL
.RIGHT JOIN
: o inverso doLEFT JOIN
, trazendo tudo da direita e o que combinar da esquerda.FULL OUTER JOIN
: traz tudo das duas tabelas, preenchendo comNULL
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