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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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
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).
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.
Figura 15 – Retorno do Outer Excluding Join