Voltar para a lista de artigos Artigos
6 minutos de leitura

O que é um SQL INNER JOIN?

Como combinar dados de diferentes tabelas em uma única consulta? Um recurso SQL chamado JOIN é o operador mais comum usado para criar consultas complexas. Aprenda o básico neste artigo.

SQL nos permite selecionar dados de mais de uma tabela. Na verdade, toda a idéia de usar bancos de dados relacionais é selecionar dados de tabelas relacionadas. E podemos usar o operador JOIN do SQL para fazer isso.

Há muitos tipos de JOINs em SQL. Neste artigo, vamos nos concentrar em INNER JOIN, que é o comando padrão JOIN (ou seja, aquele que você obtém se usar a palavra-chave JOIN por si só).

Quando você precisa de JOIN?

Por que precisaríamos unir dados de várias tabelas? A resposta simples é que às vezes uma tabela não contém todos os dados de que você precisa.

Imagine que o movie A tabela armazena informações nas colunas id, title, production_year, e director_id.

idtitleproduction_yeardirector_id
1Psycho19601
2Midnight in Paris20112
3Sweet and Lowdown19932
4Talk to her20023
5The skin I live here20113

Outra tabela, directorO site da empresa contém informações sobre seus diretores: id, name e birth_year.

idnamebirth_year
1Alfred Hitchcock1899
2Woody Allen1935
3Pedro Almodóvar1949

Note que cada filme tem apenas uma coluna relacionada com o diretor: director_id. Os mesmos valores do número de identificação na tabela director (na coluna director_id ) e na tabela movie (na coluna id ).

Gostaríamos de exibir os dados de cada filme juntamente com os detalhes de seu diretor. O resultado é uma nova tabela com dados de duas tabelas: movie e director. As tabelas são combinadas (ou unidas) com base nos números de identificação dos diretores. Em outras palavras, filmes com um director_id específico são combinados com as informações do diretor com este ID - por exemplo, o filme Psycho com director_id=1 é igualado pelo registro onde id=1 (Alfred Hitchcock) no director mesa. Veja o conjunto de resultados:

idtitleproduction_yeardirector_ididnamebirth_year
1Psycho196011Alfred Hitchcock1899
2Midnight in Paris201122Woody Allen1935
3Sweet and Lowdown199322Woody Allen1935
4Talk to her200233Pedro Almodóvar1949
5The skin I live here201133Pedro Almodóvar1949

Uma versão ilustrada de um exemplo similar é apresentada no artigo Um Guia Ilustrado para o SQL INNER JOIN.

Como usar o JOIN em uma consulta SQL

Agora, vamos analisar a consulta que acabamos de usar. Aqui está novamente:

SELECT *  
FROM movie  
JOIN director  
ON movie.director_id=director.id;

JOIN é uma forma mais curta da cláusula INNER JOIN; você pode usá-las de forma intercambiável.

Depois de SELECT suas colunas, você coloca a palavra-chave FROM e o nome da primeira tabela (neste exemplo, movie). Em seguida, você coloca JOIN (ou INNER JOIN), seguido do nome da segunda tabela (aqui, director). A seguir, a palavra-chave ON e a condição de união (ou seja, como combinar os registros de ambas as tabelas). Neste caso, a condição de junção corresponde aos valores da coluna director_id da tabela. movie com a coluna de identificação na tabela director.

Desta forma, os registros na tabela movie são combinados com os registros corretos em director. Agora sabemos que o filme Sweet and Lowdown foi dirigido pelo diretor Woody Allen, que nasceu em 1935. Este filme tem director_id=2; há um valor correspondente à coluna correspondente (id) na tabela director.

A animação abaixo mostra como funciona a utilização de um operador JOIN e quais registros são devolvidos:

ENCONTRE

Um operador JOIN trabalha logicamente, em duas etapas. A primeira etapa retorna um produto cartesiano, ou seja, cada linha da primeira tabela é combinada com cada linha da segunda tabela. Na etapa seguinte, somente os pares de registros que atendem à condição da cláusula ON são devolvidos - neste exemplo, somente as linhas onde director_id em movie é igual a id em director.

Note que os valores usados na condição de união não precisam ser números. Você também pode usar valores de texto e outras condições mais complexas. Você pode encontrar mais informações no artigo SQL INNER JOIN JOIN Explicado em Palavras Simples.

E se os registros não corresponderem?

E se houver registros na primeira tabela que não possam ser combinados com os registros na segunda tabela, ou vice versa? Como funciona o INNER JOIN neste caso? Vejamos um exemplo. Aqui está o movie tabela novamente:

idtitleproduction_yeardirector_id
1Psycho19601
2Midnight in Paris20112
3Sweet and Lowdown19932
4Talk to her20023
5The skin I live in20113
6The new house2020NULL

E aqui está director:

idnamebirth_year
1Alfred Hitchcock1899
2Woody Allen1935
3Pedro Almodóvar1949
4Martin Scorsese1942

Aqui está a mesma consulta:

SELECT title, production_year, director_id,
       id, name, birth_year   
FROM movie  
JOIN director  
ON movie.director_id=director.id;

A tabela de resultados contém apenas registros que são um par correspondente:

idtitleproduction_yeardirector_ididnamebirth_year
1Psycho196011Alfred Hitchcock1899
2Midnight in Paris201122Woody Allen1935
3Sweet and Lowdown199322Woody Allen1935
4Talk to her200233Pedro Almodóvar1949
5The skin I live in201133Pedro Almodóvar1949

Se você olhar para a mesa moviea coluna director_id é NULL para o filme A nova casa. E na tabela directoro diretor Martin Scorsese (id=4) não está relacionado a nenhuma linha na tabela movie. Portanto, estas filas não são exibidas no conjunto de resultados.

A regra para INNER JOIN (JOIN) é que somente as linhas com correspondência em ambas as tabelas são retornadas. Nos outros tipos de operadores JOIN, este comportamento é diferente. Estenda este tópico lendo o artigo SQL JOIN Types Explained.

Filtragem de Registros no Conjunto de Resultados

Você também pode filtrar os registros devolvidos por JOIN. Por exemplo, podemos listar apenas os filmes e seus diretores onde o diretor nasceu depois de 1940. Aqui está a pergunta:

SELECT title, production_year, director_id,
       id, name, birth_year   
FROM movie  
JOIN director  
ON movie.director_id=director.id
WHERE director.birth_year>1940;

Ela retorna o resultado:

idtitleproduction_yeardirector_ididnamebirth_year
4Talk to her200233Pedro Almodóvar1949
5The skin I live in201133Pedro Almodóvar1949

Mais uma vez, temos filas da tabela movie combinado com linhas da tabela director. Inicialmente, a condição de união é a mesma (ON director.id=movie.director_id).

Entretanto, na próxima etapa, os registros com valor menor ou igual a 1940 na coluna ano_de_nascimento são removidos. Assim, você não encontra Woody Allen no conjunto de resultados porque ele nasceu em 1935 (antes/menos que 1940). Alfred Hitchcock também não está aqui; ele nasceu em 1899. Fizemos isto graças a WHERE director.birth_year>1940.

Quer saber mais sobre Cláusulas JOIN em SQL?

Se você gostaria de ampliar suas habilidades, experimente nosso SQL para Iniciantes curso, que contém mais sobre como juntar mesas (incluindo muitos exercícios práticos!). Faz parte da pista Fundamentos de SQLque o ajudará a levar seus conhecimentos de SQL ao próximo nível.

Ou talvez você já conheça algum SQL e gostaria de aprender mais sobre JOINs. Nesse caso, sugiro que você veja Como Aprender Cláusulas JOIN em SQL, Tipos de SQL JOIN Explicados, e nossa folha de fraude SQL JOIN. Você também pode fazer nosso curso Cláusulas JOIN em SQL . Depois, vá praticar o que você sabe usando nosso caminho de aprendizagem on-lineTrilha de Práticas em SQL . Feliz aprendizagem!