SQL Join: Entenda como funciona o retorno dos dados

Este artigo demonstrará de forma prática como funciona cada join do SQL e o que retornará de dados.

Muitos desenvolvedores tem a dificuldade de saber qual resultado é retornado de cada join no SQL. Por conta disso, esse artigo foi desenvolvido com base em estudos e consultas na prática. A Figura 1 vai nos ajudar a entender os resultados obtidos de cada join.
Joins em SQL
Figura 1 – Joins em SQL.
Em cima dessa figura, vamos criar a estrutura e realizar as consultas usando cada join.
Para isso, o primeiro passo é criar as tabelas A e B, conforme mostra o código da Listagem 1.
Mais atenção: este post não tem o foco de melhores práticas, normalização etc. por isso, serão criadas apenas duas tabelas simples com apenas um campo chamado nome para visualizar o resultado de cada join.
Listagem 1 – Criando as tabelas.

  CREATE TABLE TabelaA(
    Nome varchar(50) NULL
  )
  GO
  CREATE TABLE TabelaB(
    Nome varchar(50) NULL
  )

Já o segundo passo inclui a inserção de valores nas tabelas A e B. A Listagem 2 exibe os valores que serão incluídos nas tabelas A e B.
Listagem 2 – Inclusão de dados nas tabelas.

  INSERT INTO TabelaA VALUES('Fernanda')
  INSERT INTO TabelaA VALUES('Josefa')
  INSERT INTO TabelaA VALUES('Luiz')
  INSERT INTO TabelaA VALUES('Fernando')
  INSERT INTO TabelaB VALUES('Carlos')
  INSERT INTO TabelaB VALUES('Manoel')
  INSERT INTO TabelaB VALUES('Luiz')
  INSERT INTO TabelaB VALUES('Fernando')

Agora, vamos analisar cada um dos joins.

Inner Join

Usando o inner join, conforme mostra a Figura 2, teremos como resultado todos os registros comuns nas duas tabelas.
 Usando
Inner Join
Figura 2 – Usando Inner Join.
Para isso executaremos os comandos presentes na Listagem 3.
Listagem 3 – Usando Inner Join

  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  INNER JOIN TabelaB as B
                  on a.Nome = b.Nome

Na prática, o resultado será conforme a Figura 3.
 Retorno do Inner Join
Figura 3 – Retorno do Inner Join.

Left Join

Usando o Left Join, conforme mostra a Figura 4, teremos como resultado todos os registros que estão na tabela A (mesmo que não estejam na tabela B) e os registros da tabela B que são comuns na tabela A. Para entender melhor, executaremos o código presente na Listagem 4.
 Usando
Left Join
Figura 4 – Usando Left Join
Listagem 4 – Usando Left Join

  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  LEFT JOIN TabelaB as B
                  on a.Nome = b.Nome

E na prática o resultado será conforme a Figura 5.
 Retorno do Left Join
Figura 5 – Retorno do Left Join.

Right Join

Usando o Right Join, conforme mostra a Figura 6, teremos como resultado todos os registros que estão na tabela B (mesmo que não estejam na tabela A) e os registros da tabela A que são comuns na tabela B. Para vermos isso na prática, executaremos os comandos da Listagem 5.
 Usando
Right Join
Figura 6 – Usando Right Join
Listagem 5 -Usando Right Join

  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  RIGHT JOIN TabelaB as B
                  on a.Nome = b.Nome

O resultado desses comando será o mesmo apresentado na Figura 7.
 Retorno do Right Join
Figura 7 – Retorno do Right Join.

Outer Join

Usando o Outer Join (conhecido por Full Outer Join ou Full Join), conforme mostra a Figura 8, teremos como resultado todos os registros que estão na tabela A e todos os registros da tabela B. Na prática, você deve executar os mesmos comando presentes na Listagem 6.
 Usando
Full Outer Join e Full Join
Figura 8 – Usando Full Outer Join e Full Join
Listagem 6 -Usando Full Outer Join ou Full Join

  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  FULL OUTER JOIN TabelaB as B
                  on a.Nome = b.Nome
  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  FULL JOIN TabelaB as B
                  on a.Nome = b.Nome

E na prática o resultado será conforme a Figura 9.
 Retorno do Full Outer Join ou Full Join
Figura 9 – Retorno do Full Outer Join ou Full Join

Left Excluding Join

Na Figura 10 temos o uso do Left Excluding Join, que retorna como resultado todos os registros que estão na tabela A e que não estejam na tabela B. Os comandos desses join estão presentes naListagem 7 e o resultado desses comandos são apresentados na Figura 11.
 Usando Left Excluding Join
Figura 10 – Usando Left Excluding Join
Listagem 7 – Usando Left Excluding Join

  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  LEFT JOIN TabelaB as B
                  on a.Nome = b.Nome
  WHERE b.Nome is null

 Retorno do Left Excluding Join
Figura 11 – Retorno do Left Excluding Join

Right Excluding Join

Usando o Right Excluding Join, conforme mostra a Figura 12, teremos como resultado todos os registros que estão na tabela B e que não estejam na tabela A. Para vermos isso na prática, precisamos executar os comandos da Listagem 8. Como resultado, teremos os mesmos registros retornados na Figura 13.
 Usando Right Excluding
Join
Figura 12 – Usando Right Excluding Join.
Listagem 8 – Usando Right Excluding Join.

  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  RIGHT JOIN TabelaB as B
                  on a.Nome = b.Nome
  WHERE a.Nome is null

 Retorno do Right Excluding Join
Figura 13 – Retorno do Right Excluding Join.

Outer Excluding Join

Usando o Outer Excluding Join, conforme mostra a Figura 14, teremos como resultado todos os registros que estão na tabela B (que não estejam na tabela A) e todos os registros que estão na tabela A (que não estejam na tabela B).
 Usando Outer Excluding Join
Figura 14 – Usando Outer Excluding Join
Para isso, executaremos o comando da Listagem 9.
Listagem 9 – Usando Outer Excluding Join

  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  FULL OUTER JOIN TabelaB as B
                  on a.Nome = b.Nome
  WHERE a.Nome is null or b.Nome is null
  SELECT a.Nome, b.Nome
  FROM TabelaA as A
  FULL JOIN TabelaB as B
                  on a.Nome = b.Nome
  WHERE a.Nome is null or b.Nome is null

E na prática o resultado será conforme a Figura 15.
 Retorno do Outer Excluding Join
Figura 15 – Retorno do Outer Excluding Join