Entendendo JOINS SQL com diagramas

Por Réulison Silva
Réulison Silva
Published on
Arrays no PostgreSQL

Considerando que uma única tabela pode ser vista como um conjunto, os diagramas de Venn são uma ótima maneira de visualizar como funcionam os JOINS em SQL. Embora provavelmente existam muitas maneiras diferentes de descrever JOINS, acredito firmemente que os diagramas de Venn irão te ajudar a entender de forma clara e consistente quais registros serão incluídos no conjunto de linhas resultante retornado quando um tipo específico de JOIN é realizado entre duas tabelas.

Neste artigo, apresentaremos uma representação visual dos seguintes tipos de JOIN.

  • Left Join (também conhecido como Left Outer Join)
  • Right Join (também conhecido como Right Outer Join)
  • Inner Join
  • Full Outer Join
  • Left Anti-Join (também conhecido como Left-Excluding Join)
  • Right Anti-Join (também conhecido como Right-Excluding Join)
  • Full Anti-Join
  • Cross-Join

Além disso, também forneceremos a sintaxe real usada para realizar os JOINS mencionadas em SQL.

Primeiramente, vamos criar duas tabelas que serão referenciadas nas seções subsequentes para demonstrar os diferentes tipos de JOINS em SQL com exemplos práticos.

Nossa primeira tabela, chamada users, possui 3 colunas e 4 registros:

idnameage
1John21
2Helen22
3Andrew31
4Bob19

A segunda tabela, chamada orders, possui 3 colunas e 5 registros:

iduser_idamount
117.99
2410.49
3245.89
4219.99
5154.89

LEFT JOIN

O primeiro tipo de JOIN que apresentaremos é a LEFT JOIN (ou LEFT OUTER JOIN). Esse tipo de JOIN resulta na combinação de todos os registros da tabela da esquerda com os registros da tabela da direita que possuem valores correspondentes na(s) coluna(s) de JOIN especificada(s). Quaisquer valores ausentes nos registros da tabela da direita incluídos no resultado serão substituídos por nulo. Para cada valor correspondente entre as tabelas da esquerda e da direita, um novo registro será retornado. Por exemplo, se uma chave na tabela da esquerda corresponder a dois registros na tabela da direita, dois registros serão retornados como parte do resultado.

Visualização do LEFT JOIN: Todas as linhas da tabela à esquerda são mantidas no resultado. Quando há uma correspondência na tabela à direita, as colunas são combinadas. Quando não há correspondência, as colunas da tabela da direita aparecem como NULL no resultado, garantindo que nenhum dado da tabela principal (esquerda) seja perdido.
Visualização do LEFT JOIN: Todas as linhas da tabela à esquerda são mantidas no resultado. Quando há uma correspondência na tabela à direita, as colunas são combinadas. Quando não há correspondência, as colunas da tabela da direita aparecem como NULL no resultado, garantindo que nenhum dado da tabela principal (esquerda) seja perdido.

Em SQL, um LEFT JOIN pode ser iniciada usando a sintaxe descrita abaixo:

SELECT *
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;

E os registros resultantes incluirão:

idnameageiduser_idamount
1John21117.99
4Bob192410.49
2Helen223245.89
2Helen224219.99
1John215154.89
3Andrew31nullnullnull

RIGHT JOIN

O segundo tipo de JOIN que apresentaremos é o RIGHT JOIN (ou RIGHT OUTER JOIN). Esse tipo de JOIN resultará na combinação de todos os registros da tabela da direita com os registros da tabela da esquerda que possuam valores correspondentes na tabela da direita, utilizando a(s) coluna(s) de JOINs especificada(s).

Visualização do RIGHT JOIN: Todas as linhas da tabela à direita são mantidas no resultado. Quando há uma correspondência na tabela à esquerda, as colunas são combinadas. Quando não há correspondência, as colunas da tabela da esquerda aparecem como NULL, garantindo a integridade dos dados da tabela secundária (direita).
Visualização do RIGHT JOIN: Todas as linhas da tabela à direita são mantidas no resultado. Quando há uma correspondência na tabela à esquerda, as colunas são combinadas. Quando não há correspondência, as colunas da tabela da esquerda aparecem como NULL, garantindo a integridade dos dados da tabela secundária (direita).

A sintaxe SQL para um RIGHT JOIN está descrita abaixo:

SELECT *
FROM users u
RIGHT JOIN orders o
ON u.id = o.user_id;

Com nas tabelas de exemplo, segue resultado abaixo:

idnameageiduser_idamount
1John21117.99
4Bob192410.49
2Helen223245.89
2Helen224219.99
1John215154.89

INNER JOIN

Um INNER JOIN entre duas tabelas resultará em um conjunto de registros que possuem um valor em comum na(s) coluna(s) de JOINs especificada(s).

Visualização do INNER JOIN: Apenas os registros que possuem correspondência em ambas as tabelas são incluídos no resultado. O JOIN atua como um filtro, produzindo um conjunto de dados que representa a interseção entre as duas tabelas, baseado na condição de igualdade especificada.
Visualização do INNER JOIN: Apenas os registros que possuem correspondência em ambas as tabelas são incluídos no resultado. O JOIN atua como um filtro, produzindo um conjunto de dados que representa a interseção entre as duas tabelas, baseado na condição de igualdade especificada.

Para realizar um INNER JOIN, basta executar a seguinte consulta:

SELECT *
FROM users u
INNER JOIN orders o
ON u.id = o.user_id;

Observe que você pode até omitir a palavra-chave INNER – em outras palavras, a consulta acima é equivalente à descrita abaixo:

SELECT *
FROM users u
JOIN orders o
ON u.id = o.user_id;

Resultado:

idnameageiduser_idamount
1John21117.99
4Bob192410.49
2Helen223245.89
2Helen224219.99
1John215154.89

FULL OUTER JOIN

Um FULL OUTER JOIN em SQL incluirá essencialmente todos os registros das tabelas da esquerda e da direita. Esse tipo de JOIN utiliza as chaves de ambas as tabelas – para quaisquer linhas ausentes, serão inseridos valores nulos.

Visualização do FULL OUTER JOIN: Inclui todos os registros de ambas as tabelas. Registros correspondentes são combinados, enquanto registros sem correspondência na tabela oposta são mantidos com valores NULL nas colunas ausentes. Este JOIN produz a união completa dos conjuntos de dados.
Visualização do FULL OUTER JOIN: Inclui todos os registros de ambas as tabelas. Registros correspondentes são combinados, enquanto registros sem correspondência na tabela oposta são mantidos com valores NULL nas colunas ausentes. Este JOIN produz a união completa dos conjuntos de dados.

A sintaxe para um FULL OUTER JOIN está descrita abaixo:

SELECT *
FROM users u
FULL OUTER JOIN orders o
ON u.id = o.user_id;

Resultado:

idnameageiduser_idamount
1John21117.99
4Bob192410.49
2Helen223245.89
2Helen224219.99
1John215154.89
3Andrew31nullnullnull

LEFT ANTI-JOIN

Um LEFT ANTI-JOIN conterá todos os registros da tabela da esquerda cujas chaves de JOIN não aparecem na tabela da direita.

Visualização do LEFT ANTI-JOIN: Retorna apenas os registros da tabela à esquerda que NÃO possuem uma correspondência na tabela à direita. É o oposto de um INNER JOIN nesta perspectiva, sendo útil para identificar dados ausentes ou exclusivos de uma tabela em relação à outra.
Visualização do LEFT ANTI-JOIN: Retorna apenas os registros da tabela à esquerda que NÃO possuem uma correspondência na tabela à direita. É o oposto de um INNER JOIN nesta perspectiva, sendo útil para identificar dados ausentes ou exclusivos de uma tabela em relação à outra.

Em outras palavras, o LEFT ANTI-JOIN retornará todos os clientes que ainda não fizeram nenhum pedido. Em SQL, isso se traduz como:

SELECT *
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id
WHERE o.user_id is null;

E os dados resultantes estão descritos abaixo:

idnameageiduser_idamount
3Andrew31nullnullnull

RIGHT ANTI-JOIN

Da mesma forma, um RIGHT ANTI-JOIN conterá todos os registros da tabela à direita cujas chaves não aparecem no quadro à esquerda.

Visualização do RIGHT ANTI-JOIN: Retorna apenas os registros da tabela à direita que NÃO possuem uma correspondência na tabela à esquerda. É o espelho do LEFT ANTI-JOIN, sendo útil para identificar dados exclusivos da segunda tabela em relação à primeira.
Visualização do RIGHT ANTI-JOIN: Retorna apenas os registros da tabela à direita que NÃO possuem uma correspondência na tabela à esquerda. É o espelho do LEFT ANTI-JOIN, sendo útil para identificar dados exclusivos da segunda tabela em relação à primeira.
SELECT *
FROM users u
RIGHT JOIN orders o
ON u.id = o.user_id
WHERE u.id is null;

Note que, com as tabelas de exemplo, essa consulta não retornará registros, visto que todos os usuários que fizeram um pedido (ou seja, os que estão na tabela orders) aparecem na tabela à esquerda (ou seja, a tabela users).

FULL ANTI-JOIN

Um FULL ANTI-JOIN conterá todos os registros das tabelas da esquerda e da direita que não possuem nenhuma chave em comum.

Visualização do FULL ANTI-JOIN: Retorna todos os registros que são exclusivos de ambas as tabelas, excluindo qualquer registro que tenha uma correspondência na tabela oposta. É a união dos resultados do LEFT ANTI-JOIN e RIGHT ANTI-JOIN, útil para identificar dados completamente distintos entre os dois conjuntos.
Visualização do FULL ANTI-JOIN: Retorna todos os registros que são exclusivos de ambas as tabelas, excluindo qualquer registro que tenha uma correspondência na tabela oposta. É a união dos resultados do LEFT ANTI-JOIN e RIGHT ANTI-JOIN, útil para identificar dados completamente distintos entre os dois conjuntos.
SELECT *
FROM users u
JOIN orders o
ON u.id = o.user_id
WHERE u.id is null and o.user_id is null;

CROSS JOIN

O CROSS JOIN não pode ser visualizada com um diagrama de Venn, pois essencialmente cria todas as combinações possíveis entre os registros de cada uma das tabelas envolvidas. Portanto, você nem precisa fornecer uma chave do JOIN (ou seja, a palavra-chave ON em SQL).

SELECT *
FROM users u
CROSS JOIN orders o;

A consulta acima retornará 20 registros, visto que a tabela da esquerda contém 4 registros e a da direita 5.

Um diagrama de Venn é uma estrutura muito usada para visualizar o conjunto de registros resultante de uma junção específica entre duas tabelas distintas. Neste tutorial, abordamos a maioria dos tipos de JOIN disponíveis em SQL, visualizando-os com diagramas adequados e compartilhando a sintaxe de consulta correspondente.

Dominar JOIN em SQL é fundamental para profissionais que trabalham com dados, pois permite reunir registros de diversas fontes, agregando valor aos negócios e auxiliando na tomada de decisões.

Fique ligado

Seja um Expert em Growth

Receba insights práticos sobre marketing, dados, performance e tecnologia direto no seu email.