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 |
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.