devgameschool

O que é INNER JOIN no SQL e como usar?

Até aqui toda consulta lia uma tabela de cada vez. O INNER JOIN lê duas: ele junta cada linha de uma tabela com a linha da outra que tem o mesmo valor numa coluna combinada, e devolve as duas coladas, como se fossem uma tabela só. Serve para quando a resposta está espalhada — um número numa tabela, o nome dele em outra.

Como se escreve

SELECT <colunas> FROM <tabela1> INNER JOIN <tabela2>
ON <tabela1>.<coluna> = <tabela2>.<coluna>;

O ON diz o par: qual coluna de um lado tem que ser igual à do outro. tabela.coluna, com ponto, é como se escreve uma coluna quando o nome sozinho não deixa claro de qual tabela ela vem.

Exemplo para rodar

As duas tabelas de sempre, uma virada para a outra: o título do livro mora em livro.titulo, e o mesmo título mora em emprestimo.livro, anotado toda vez que o livro sai emprestado.

Todos os exemplos usam duas tabelinhas: livro (titulo, autor, ano, paginas) e emprestimo (livro, retirado_em, leitor, dias).

SELECT titulo, retirado_em FROM livro INNER JOIN emprestimo ON livro.titulo = emprestimo.livro;
titulo retirado_em
O Cortiço 2026-03-15
Vidas Secas 2026-03-02
Capitães da Areia 2026-04-04
A Hora da Estrela 2026-03-31
4 linhas no resultado

Dicas

  • O ON não é um filtro qualquer: é o que diz que linha de um lado casa com que linha do outro. Sem ele, a consulta casa tudo com tudo — cada linha de uma tabela com cada linha da outra.
  • Quando as duas tabelas têm uma coluna com o mesmo nome — como id, no arquivo da delegacia, onde toda tabela tem a sua —, o nome sozinho não basta em lugar nenhum da consulta, nem no ON nem no SELECT nem no WHERE: escreva tabela.coluna. Sem isso o SQLite responde ambiguous column name, porque achou a coluna nas duas tabelas e não sabe qual das duas você quis.
  • INNER JOIN só traz a linha que acha par do outro lado. Quem não tem par correspondente fica de fora do resultado — é por isso que se chama INNER, de dentro.
  • Dá para juntar mais de duas tabelas: cada INNER JOIN novo pede o seu próprio ON, um atrás do outro, e a corrente pode crescer — uma tabela junta com a outra, que junta com a terceira.
  • A palavra INNER é opcional: JOIN sozinho já significa INNER JOIN. O manual escreve as duas palavras para deixar claro que tipo de junção é esta.

Erros comuns

Você escreveu
SELECT titulo, retirado_em FROM livro INNER JOIN emprestimo;
O SQLite respondeu
Nenhum erro, e vinte e quatro linhas: cada um dos seis livros casado com cada um dos quatro empréstimos.
Como consertar
Faltou o ON. Sem ele, o INNER JOIN casa cada linha de uma tabela com cada linha da outra — seis vezes quatro, vinte e quatro combinações — em vez de só o par certo. O ON diz qual coluna de um lado tem que ser igual à do outro: ON livro.titulo = emprestimo.livro.
Você escreveu
SELECT livro.titulo, emprestimo.retirado_em FROM livro INNER JOIN emprestimos ON livro.titulo = emprestimos.livro;
O SQLite respondeu
no such table: emprestimos
Como consertar
A tabela é emprestimo, no singular. Erro de digitação no nome depois do INNER JOIN.
Você escreveu
SELECT titulo, retirado_em FROM livro INNER JOIN emprestimo ON livro = emprestimo.livro;
O SQLite respondeu
Nenhum erro, e vinte e quatro linhas: as mesmas vinte e quatro combinações de quando faltou o ON, só que numa ordem diferente.
Como consertar
livro sozinho parece que devia apontar para a tabela livro, mas ela não tem coluna com esse nome — a coluna dela é titulo. A única coluna chamada livro nas duas tabelas juntadas é emprestimo.livro, e foi para ela que o SQLite resolveu o nome sozinho. A condição virou emprestimo.livro = emprestimo.livro, sempre verdadeira. O certo é livro.titulo = emprestimo.livro.

Veja também

Onde isso aparece no jogo

No jogo Delegacia SQL, INNER JOIN é o que resolve o inquérito 008, "A folha que ficou de fora". SISPOL, que aparece nas dicas, é o computador da delegacia do jogo.

Jogar Delegacia SQL