SQL JOIN(INNER, LEFT, RIGHT e FULL) combinando tabelas!

O SQL JOIN é um dos comandos que mais geram dúvidas entre pessoas desenvolvedoras. Afinal, ele apresenta diferentes tipos, cada qual para uma situação, e é usado para combinar dados de consultas complexas.

Por isso, utilizar o tipo de JOIN inadequado para um query, por exemplo, além de resultar em um retorno diferente do esperado, pode gerar até problemas de performance no banco.

No entanto, ao entender como cada JOIN funciona e para que eles servem, um universo de possibilidades se abre. Para ajudar você nesse caminho, neste post vamos mostrar:

Boa leitura!

O que é o comando SQL JOIN?

O JOIN é uma cláusula muito importante da linguagem SQL cuja função é combinar linhas de diferentes tabelas de acordo com as relações existentes entre as colunas dessas tabelas

Basicamente o JOIN é usado em diferentes métodos de junção que são baseados na Teoria dos Conjuntos. Ao todo, a linguagem SQL padrão define cinco tipos diferentes de cláusula JOIN. São elas: 

  • INNER JOIN;
  • RIGHT JOIN;
  • LEFT JOIN;
  • FULL JOIN;
  • CROSS JOIN.

Assim, cada uma delas é usada para retornar um conjunto específico de dados. Mais adiante, mostramos em detalhes o uso de cada JOIN.

Criando a tabela e inserindo os dados

Para mostrar o funcionamento e o retorno de cada JOIN vamos precisar de exemplos práticos, certo? Então, vamos criar algumas tabelas simples para fazer nossos testes. No entanto, para simplificar a demonstração, não vamos nos ater a questões de modelagem no momento, já que o objetivo é explicar o uso correto da cláusula JOIN em suas diferentes formas.

As tabelas que vamos criar se chamam, respectivamente, “estudantes” e “professores”. Em ambas, teremos uma coluna “nome”, na qual serão inseridos dados em comum, pois é isso que nos permitirá testar os comandos.

Abaixo, mostramos o código usado para criar a estrutura das tabelas e pupulá-las com os dados do nosso teste.

código tabela studantes
Resultado tabela alunos
Figura 1. Tabela estudantes
código tabela professores
Resultado tabela professores
Figura 2. Tabela professores

Quais os tipos de SQL JOINS?

Nosso ambiente de testes já foi preparado, então podemos seguir para a explicação de cada JOIN. Confira!

INNER JOIN

Entre os métodos de junção, o INNER JOIN é um dos mais conhecidos e tem a função de retornar os valores em comum de ambas as tabelas. Na ilustração abaixo, é possível ver a representação desse retorno de forma gráfica. Observe:

Retorno do INNER JOIN
Figura 3. Retorno do INNER JOIN

Sintaxe

Neste primeiro exemplo, vamos usar o INNER JOIN para consultar o id e o nome dos registros das tabelas “estudantes” e “professores” que têm dados equivalentes na coluna “nome”. 

Observe que, na sintaxe abaixo, acrescentamos um “e.” e um “p.” antes do nome das colunas da tabela e que, nas linhas seguinte,s usamos as expressões “estudantes AS e” e “professores AS p”. Isso é uma forma de definir uma espécie de “pseudônimo” para as tabelas. Dessa forma elas podem ser diferenciadas durante a execução.

Já na última linha, usamos a expressão ON para indicar qual coluna das tabelas deve ter seus dados comparados.

 SELECT e.id, e.nome, p.id, p.nome
 FROM estudantes AS e
 INNER JOIN professores AS p
 ON e.nome = p.nome; 
resultado tabela dados comparados

Figura 4. Demonstração do resultado de um INNER JOIN

LEFT JOIN 

O LEFT JOIN é usado para retornar todos os registros da tabela esquerda, além dos registros da tabela à direita que têm valores em comum com a tabela esquerda. Veja a ilustração a seguir para entender melhor:

Exemplo retorno LEFT JOIN

Figura 5. Retorno do LEFT JOIN

Sintaxe

Observe que o código a seguir é bastante parecido com o do exemplo anterior. No entanto, como queremos apenas os dados da tabela esquerda mais os registros em comum da tabela direita, utilizamos o operador LEFT JOIN.

 SELECT e.nome, p.nome
 FROM estudantes AS e
 LEFT JOIN professores AS p
 ON e.nome = p.nome; 
Resultado tabela
Figura 6. Demonstração do resultado de um LEFT JOIN

LEFT EXCLUDING JOIN 

Já com o LEFT EXCLUDING JOIN é possível retornar todos os dados da tabela esquerda que não têm valores correspondentes na tabela da direita. Na imagem mostrada abaixo, vemos uma representação desse tipo de resultado. 

LEFT EXCLUDING JOIN retorno exemplo
Figura 7. Retorno do LEFT EXCLUDING JOIN

Sintaxe

Prosseguindo com nossa demonstração, repare que agora acrescentamos a cláusula WHERE no fim do comando. Dessa forma, definimos um filtro para excluir do retorno os dados em comum entre as tabelas.

 SELECT e.nome, p.nome
 FROM estudantes AS e
 LEFT JOIN professores AS p
 ON e.nome = p.nome
 WHERE p.nome IS NULL; 
Demonstração do resultado de um LEFT EXCLUDING JOIN

Figura 8. Demonstração do resultado de um LEFT EXCLUDING JOIN

RIGHT JOIN 

Ao usar o RIGHT JOIN, podemos retornar todos os valores da tabela direita juntamente com os registros em comum na tabela esquerda. A seguir, observe o exemplo gráfico desse retorno:

Retorno do RIGHT JOIN
Figura 9. Retorno do RIGHT JOIN

Sintaxe

Dessa vez, como queremos retornar os dados da coluna “nome” na tabela direita mais os registros com valores repetidos na tabela esquerda, usamos o operador RIGHT JOIN no código.

 SELECT e.nome, p.nome
 FROM estudantes AS e
 RIGHT JOIN professores AS p
 ON e.nome = p.nome; 
Demonstração do resultado de um RIGHT JOIN / SQL JOIN
Figura 10. Demonstração do resultado de um RIGHT JOIN

RIGHT EXCLUDING JOIN 

Como é mostrado na figura abaixo, o RIGHT EXCLUDING JOIN é responsável por retornar os dados da tabela da direita que não têm valores iguais na tabela esquerda.

Retorno do RIGHT EXCLUDING JOIN
Figura 11. Retorno do RIGHT EXCLUDING JOIN

Sintaxe

Novamente, para excluir os dados com valores em comum do retorno, usamos um filtro na cláusula WHERE. Porém, dessa vez os dados serão filtrados na tabela “estudantes”.

 SELECT e.nome, p.nome
 FROM estudantes AS e
 RIGHT JOIN professores AS p
 ON e.nome = p.nome
 WHERE e.nome IS NULL; 
Demonstração do resultado de um RIGHT EXCLUDING JOIN / SQL JOIN
Figura 12. Demonstração do resultado de um RIGHT EXCLUDING JOIN

FULL JOIN

O FULL JOIN, também conhecido como FULL OUTER JOIN, retorna todos os dados de ambas as tabelas quando há uma relação entre elas. Na imagem abaixo, é possível ver de forma gráfica o retorno desse comando:

Retorno do FULL JOIN
Figura 13. Retorno do FULL JOIN

Sintaxe

Na sintaxe abaixo, observe que agora usamos o comando FULL OUTER JOIN para retornar todos os dados da coluna “nome” comparando a igualdade dos valores desse campo de ambas as tabelas.

 SELECT e.nome, p.nome
 FROM estudantes AS e
 FULL OUTER JOIN professores AS p
 ON e.nome = p.nome; 
Demonstração do resultado de um FULL JOIN
Figura 14. Demonstração do resultado de um FULL JOIN

FULL EXCLUDING JOIN

Com o FULL EXCLUDING JOIN podemos retornar todos os registros que não têm valores repetidos entre as tabelas. Ou seja, ele exclui do retorno todos os dados duplicados, como é possível ver na figura abaixo:

Retorno do FULL EXCLUDING JOIN
Figura 15. Retorno do FULL EXCLUDING JOIN

Sintaxe

Agora, perceba que acrescentamos no código um filtro com múltiplas condições usando o operador OR na cláusula WHERE. Dessa forma, conseguimos excluir os nomes em comum entre as tabelas, retornando apenas os dados que não se repetem.

 SELECT e.nome, p.nome
 FROM estudantes AS e
 FULL OUTER JOIN professores AS p
 ON e.nome = p.nome
 WHERE e.nome IS NULL OR p.nome IS NULL; 
Demonstração do resultado de um FULL EXCLUDING JOIN / SQL JOIN
Figura 16. Demonstração do resultado de um FULL EXCLUDING JOIN

CROSS JOIN

Com o comando SQL CROSS JOIN é possível fazer um produto cartesiano entre as tabelas. Isso significa que para cada linha da tabela esquerda ele vai retornar todas as linhas da tabela direita, ou vice-versa. Para facilitar o entendimento, observe o exemplo gráfico desse tipo de retorno abaixo:

Retorno do CROSS JOIN
Figura 17. Retorno do CROSS JOIN

Sintaxe

Neste último exemplo, vamos fazer o produto cartesiano entre os campos “nome” e “idade” das tabelas “estudantes” e “professores”. Contudo, para limitar o tamanho do retorno, vamos definir um filtro para consultar apenas os registros com id igual a 1 em ambas as tabelas.

 SELECT e.idade, e.nome, p.idade, p.nome
 FROM estudantes AS e
 CROSS JOIN professores AS p
 WHERE e.id = 1 OR p.id = 1; 
Demonstração do resultado de um CROSS JOIN
Figura 18. Demonstração do resultado de um CROSS JOIN

Boas práticas ao usar o comando SQL JOIN

Apesar de ser um comando muito importante para quem trabalha com bancos de dados SQL, o JOIN também é um dos que mais causa dificuldade entre pessoas desenvolvedoras iniciantes. Um dos motivos é a falta de conhecimento acerca do relacionamento entre tabelas.

Antes de criar uma consulta utilizando as cláusulas JOIN, é preciso entender como a modelagem do banco foi feita para se ter uma boa noção de como suas tabelas se relacionam, identificando as dependências entre elas.

Compreender como esses relacionamentos funcionam é o que nos permite identificar qual dos tipos de JOIN é mais indicado para uma determinada consulta de acordo com os dados que queremos obter.

Ao longo desse conteúdo foi possível notar o quanto o comando SQL JOIN é versátil. Afinal, com suas variações podemos criar consultas mais complexas e combinar dados de diversas formas sem precisar gastar uma enorme quantidade de código.

Gostou do conteúdo e quer aprender mais sobre a área de Banco de Dados? Então confira o próximo artigo e descubra o que faz um profissional de DBA!