Entendendo JOINS SQL com diagramas

- Published on

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:
| id | name | age |
|---|---|---|
| 1 | John | 21 |
| 2 | Helen | 22 |
| 3 | Andrew | 31 |
| 4 | Bob | 19 |
A segunda tabela, chamada orders, possui 3 colunas e 5 registros:
| id | user_id | amount |
|---|---|---|
| 1 | 1 | 7.99 |
| 2 | 4 | 10.49 |
| 3 | 2 | 45.89 |
| 4 | 2 | 19.99 |
| 5 | 1 | 54.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.

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:
| id | name | age | id | user_id | amount |
|---|---|---|---|---|---|
| 1 | John | 21 | 1 | 1 | 7.99 |
| 4 | Bob | 19 | 2 | 4 | 10.49 |
| 2 | Helen | 22 | 3 | 2 | 45.89 |
| 2 | Helen | 22 | 4 | 2 | 19.99 |
| 1 | John | 21 | 5 | 1 | 54.89 |
| 3 | Andrew | 31 | null | null | null |
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).

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:
| id | name | age | id | user_id | amount |
|---|---|---|---|---|---|
| 1 | John | 21 | 1 | 1 | 7.99 |
| 4 | Bob | 19 | 2 | 4 | 10.49 |
| 2 | Helen | 22 | 3 | 2 | 45.89 |
| 2 | Helen | 22 | 4 | 2 | 19.99 |
| 1 | John | 21 | 5 | 1 | 54.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).

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:
| id | name | age | id | user_id | amount |
|---|---|---|---|---|---|
| 1 | John | 21 | 1 | 1 | 7.99 |
| 4 | Bob | 19 | 2 | 4 | 10.49 |
| 2 | Helen | 22 | 3 | 2 | 45.89 |
| 2 | Helen | 22 | 4 | 2 | 19.99 |
| 1 | John | 21 | 5 | 1 | 54.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.

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:
| id | name | age | id | user_id | amount |
|---|---|---|---|---|---|
| 1 | John | 21 | 1 | 1 | 7.99 |
| 4 | Bob | 19 | 2 | 4 | 10.49 |
| 2 | Helen | 22 | 3 | 2 | 45.89 |
| 2 | Helen | 22 | 4 | 2 | 19.99 |
| 1 | John | 21 | 5 | 1 | 54.89 |
| 3 | Andrew | 31 | null | null | null |
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.

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:
| id | name | age | id | user_id | amount |
|---|---|---|---|---|---|
| 3 | Andrew | 31 | null | null | null |
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.

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.

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.