Voltar para a lista de artigos Artigos
4 minutos de leitura

SQL JOIN explicado

Um SQL JOIN é um método de recuperação de dados de duas ou mais tabelas de banco de dados. Este artigo apresenta uma visão geral básica de como serão os dados de um determinado SQL join. Uma maneira popular de entender os SQL joins é visualizá-los usando diagramas Venn, de modo que cada exemplo tenha o diagrama Venn correspondente, a declaração apropriada SELECT e a tabela de resultados.

Existem alguns tipos principais de joins SQL:

  • JOINO INNER
  • EXTERIOR [ESQUERDA | DIREITA | COMPLETA] UNIR
  • NATURAL JOIN
  • CROSS JOIN

Distinguimos a implementação destas uniões com base nos operadores de uniões:

  • equi e
  • theta, que será descrita mais tarde.
tipos de uniões sql

Para os propósitos deste artigo, vamos discutir as uniões usando um exemplo simples. Suponhamos que temos duas tabelas básicas, TableA e TableB, que são preenchidas com alguns dados de exemplo. Como vamos unir as tabelas na coluna name, distinguimos as linhas com o mesmo nome destacando-as em vermelho.

Dois exemplos de tabelas do banco de dados, SQL JOIN

Nas seções seguintes, veremos o que acontece com estes dados quando diferentes tipos de junções são implementadas.

JUNÇÃO CROSS

Um CROSS JOIN é um produto cartesiano da TableA e TableB. Cada linha da TableA é igualada com cada linha da TableB; é por isso que uma CROSS JOIN não faz sentido na maioria das situações.

Diagrama Venn que ilustra o SQL CROSS JOIN

SELECT *
FROM tableA
CROSS JOIN tableB;

Exemplo mostrando como o SQL CROSS JOIN funciona em duas tabelas

TableA e TableB contêm 4 fileiras. A tabela resultante terá 4 * 4 = 16 fileiras e terá a seguinte aparência:

A tabela sendo o resultado de SQL CROSS JOIN

INNER JOIN

Um INNER JOIN funde SOMENTE as linhas correspondentes em AMBOS as tabelas. Um JOIN sem nenhuma outra palavra-chave JOIN (como INNER, OUTER, LEFT, etc.) é um INNER JOIN. Os resultados são encontrados na área de sobreposição.

Diagrama Venn que ilustra o SQL INNER JOIN
 
SELECT *
FROM tableA
INNER JOIN tableB
  ON tableA.name = tableB.name

Exemplo mostrando como o SQL INNER JOIN funciona em duas tabelas

A tabela resultante será a seguinte:

A tabela sendo o resultado do SQL INNER JOIN

JOGOS DE FORA

FULL OUTER JOIN devolve filas iguais e incomparáveis de ambas as tabelas (é uma união de ambas). Se não houver correspondência, o lado que falta conterá nulo.

Diagrama Venn ilustrando o SQL FULL OUTER JOIN

 
SELECT *
FROM TableA
FULL OUTER JOIN TableB
  ON TableA.name = TableB.name;

Exemplo mostrando como o SQL FULL OUTER JOIN funciona em duas tabelas

A tabela resultante será a seguinte:

A tabela sendo o resultado de SQL FULL OUTER JOIN

A LEFT OUTER JOIN retorna todas as linhas da tabela da esquerda (TableA) com as linhas correspondentes da tabela da direita (TableB) ou nula - se não houver correspondência na tabela da direita.

Os resultados podem ser encontrados em todo o círculo da esquerda:

Diagrama Venn ilustrando o SQL LEFT OUTER JOIN

SELECT *
FROM TableA
LEFT OUTER JOIN TableB
  ON tableA.name = tableB.name;

Exemplo mostrando como o SQL LEFT OUTER JOIN funciona em duas tabelas

A tabela resultante será a seguinte:

A tabela sendo o resultado de SQL LEFT OUTER JOIN

Uma JUNTA DE OUTRA DIREITA retorna todas as linhas da tabela da direita (TableB) com as linhas correspondentes da tabela da esquerda (TableA) ou nula - se não houver correspondência na tabela da esquerda.

Os resultados podem ser encontrados em todo o círculo da direita:

Diagrama Venn ilustrando o SQL RIGHT OUTER JOIN

SELECT *
FROM tableA
RIGHT OUTER JOIN tableB
  ON tableA.name = tableB.name

Exemplo mostrando como o SQL RIGHT OUTER JOIN funciona em duas tabelas

A tabela resultante será a seguinte:

A tabela sendo o resultado de SQL RIGHT OUTER JOIN

Entradas baseadas em operadores

Implementação Equi-join

Este JOIN é feito usando o operador de igualdade (=) para comparar valores da chave primária de uma tabela e os valores da chave externa de outra tabela.

SELECT *
FROM TableA
INNER/OUTER JOIN TableB
  ON TableA.PK =TableB.Fk;

Implementação de Theta-join (não-equi)

Isto é o mesmo que o equi JOIN mas permite a todos os outros operadores como >, &lt, >= etc.

SELECT *
FROM TableA 
INNER/OUTER JOIN TableB
  ON tableA.Pk <= tableB.Fk;

Implementação auto-integrada

Este tipo de JUNTO é normalmente usado no caso de um tipo de relação unária, onde uma tabela é combinada com ela mesma.

SELECT *
FROM TableA A1
JOIN TableA A2
  ON A1.Pk = A2.Fk;

JUNTURA NATURAL

Uma adesão NATURAL é um tipo de adesão EQUI. Não há necessidade de usar uma cláusula ON. As colunas com o mesmo nome nas tabelas associadas aparecem apenas uma vez.

SELECT * 
FROM tableA
NATURAL JOIN tableB

Através da manipulação de palavras-chave, podemos excluir dados específicos.

Um OUTER EXCLUDING JOIN retorna todos os registros na TabelaA e todos os registros na TabelaB que não correspondem.

Diagrama Venn que ilustra o SQL OUTER EXCLUDING JOIN
SELECT *
FROM tableA
FULL OUTER JOIN tableB
  ON tableA.name = tableB.name
WHERE tableA.name IS NULL
  OR tableB.name IS NULL

Exemplo mostrando como o SQL OUTER EXCLUDING JOIN funciona em duas tabelas

A tabela resultante será a seguinte:

A tabela sendo o resultado do SQL OUTER EXCLUDING JOIN

Um LEFT EXCLUDING JOIN devolve todos os registros na TabelaA que não correspondem a nenhum registro na TabelaB.

Diagrama Venn ilustrando o SQL LEFT EXCLUDING JOIN

SELECT *
FROM tableA
LEFT JOIN tableB
  ON tableA.name = tableB.name
WHERE tableB.name IS NULL

Exemplo mostrando como o SQL LEFT EXCLUDING JOIN funciona em duas tabelas

A tabela resultante será a seguinte:

A tabela sendo o resultado do SQL LEFT EXCLUDING JOIN

A RIGHT EXCLUDING JOIN retorna todos os registros na TabelaB que não correspondem a nenhum registro na TabelaA.

Diagrama Venn ilustrando o SQL RIGHT EXCLUDING JOIN

SELECT *
FROM tableA
RIGHT JOIN tableB
  ON tableA.name = tableB.name
WHERE tableA.name IS NULL

Exemplo mostrando como o SQL RIGHT EXCLUDING JOIN funciona em duas tabelas

A tabela resultante será a seguinte:

A tabela sendo o resultado do SQL RIGHT EXCLUDING JOIN

Um monte de links úteis: