

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Cláusula JOIN
<a name="join-clause"></a>

Uma cláusula SQL JOIN é usada para combinar os dados de duas ou mais tabelas com base em campos comuns. Os resultados podem ou não mudar dependendo do método de junção especificado. Junções externas esquerdas e direitas retêm valores de uma das tabelas de junção quando nenhuma correspondência é encontrada na outra tabela. 

A combinação do tipo JOIN e da condição de junção determina quais linhas são incluídas no conjunto de resultados final. As cláusulas SELECT e WHERE então controlam quais colunas são retornadas e como as linhas são filtradas. Compreender os diferentes tipos de JOIN e como usá-los de forma eficaz é uma habilidade crucial em SQL, pois permite combinar dados de várias tabelas de forma flexível e poderosa.

## Sintaxe
<a name="join-clause-syntax"></a>

```
SELECT column1, column2, ..., columnn
FROM table1
join_type table2
ON table1.column = table2.column;
```

## Parâmetros
<a name="join-clause-parameters"></a>

 *SELECIONE coluna1, coluna2,..., coluna N*   
As colunas que você deseja incluir no conjunto de resultados. Você pode selecionar colunas de uma ou de ambas as tabelas envolvidas no JOIN. 

 *DA tabela 1*   
A primeira tabela (esquerda) na operação JOIN.

 *[JUNÇÃO \$1 JUNÇÃO INTERNA \$1 JUNÇÃO ESQUERDA [EXTERNA] \$1 JUNÇÃO DIREITA [EXTERNA] \$1 JUNÇÃO COMPLETA [EXTERNA]] tabela 2:*   
O tipo de JOIN a ser executado. JOIN ou INNER JOIN retorna somente as linhas com valores correspondentes em ambas as tabelas.   
LEFT [OUTER] JOIN retorna todas as linhas da tabela à esquerda, com as linhas correspondentes da tabela à direita.   
RIGHT [OUTER] JOIN retorna todas as linhas da tabela à direita, com as linhas correspondentes da tabela esquerda.   
FULL [OUTER] JOIN retorna todas as linhas das duas tabelas, independentemente de haver uma correspondência ou não.   
CROSS JOIN cria um produto cartesiano das linhas das duas tabelas.

 *NA tabela1.coluna = tabela2.coluna*   
A condição de junção, que especifica como as linhas nas duas tabelas são correspondidas. A condição de junção pode ser baseada em uma ou mais colunas.

 *Condição WHERE:*   
Uma cláusula opcional que pode ser usada para filtrar ainda mais o conjunto de resultados, com base em uma condição especificada. 

## Exemplo
<a name="Join_examples"></a>

O exemplo a seguir é uma junção entre duas tabelas com a cláusula USING. Nesse caso, as colunas listid e eventid são usadas como colunas de junção. Os resultados são limitados a cinco linhas.

```
select listid, listing.sellerid, eventid, listing.dateid, numtickets
from listing join sales
using (listid, eventid)
order by 1
limit 5;

listid | sellerid | eventid | dateid | numtickets
-------+----------+---------+--------+-----------
1      | 36861    | 7872    | 1850   | 10
4      | 8117     | 4337    | 1970   | 8
5      | 1616     | 8647    | 1963   | 4
5      | 1616     | 8647    | 1963   | 4
6      | 47402    | 8240    | 2053   | 18
```

# Tipos de união
<a name="join-types"></a>

## INNER
<a name="inner-join"></a>

Esse é o tipo de junção padrão. Retorna as linhas que têm valores correspondentes nas duas referências da tabela. 

O INNER JOIN é o tipo mais comum de junção usado em SQL. É uma forma poderosa de combinar dados de várias tabelas com base em uma coluna comum ou conjunto de colunas. 

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
```

A consulta a seguir retornará todas as linhas em que há um valor de customer\$1id correspondente entre as tabelas de clientes e pedidos. O conjunto de resultados conterá as colunas customer\$1id, name, order\$1id e order\$1date.

```
SELECT customers.customer_id, customers.name, orders.order_id, orders.order_date
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
```

A consulta a seguir é uma junção interna (sem a palavra-chave JOIN) entre a tabela LISTING e a tabela SALES, onde o LISTID da tabela LISTING está entre 1 e 5. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTID 1, 4 e 5 correspondem aos critérios.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing, sales
where listing.listid = sales.listid
and listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

O exemplo a seguir é uma junção interna com a cláusula ON. Nesse caso, as linhas NULL não são retornadas.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

A consulta a seguir é uma junção interna de duas subconsultas na cláusula FROM. A consulta encontra o número de ingressos vendidos e não vendidos para categorias diferentes de eventos (shows e apresentações). As subconsultas da cláusula FROM são subconsultas da *tabela*. Elas podem retornar várias colunas e linhas.

```
select catgroup1, sold, unsold
from
(select catgroup, sum(qtysold) as sold
from category c, event e, sales s
where c.catid = e.catid and e.eventid = s.eventid
group by catgroup) as a(catgroup1, sold)
join
(select catgroup, sum(numtickets)-sum(qtysold) as unsold
from category c, event e, sales s, listing l
where c.catid = e.catid and e.eventid = s.eventid
and s.listid = l.listid
group by catgroup) as b(catgroup2, unsold)

on a.catgroup1 = b.catgroup2
order by 1;

catgroup1 |  sold  | unsold
----------+--------+--------
Concerts  | 195444 |1067199
Shows     | 149905 | 817736
```

## ESQUERDA [EXTERNA]
<a name="left-outer-join"></a>

Retorna todos os valores da referência da tabela à esquerda e os valores correspondentes da referência da tabela à direita ou acrescenta NULL se não houver correspondência. Também é conhecida como *junção externa esquerda*. 

Ele retorna todas as linhas da tabela esquerda (primeira) e as linhas correspondentes da tabela direita (segunda). Se não houver correspondência na tabela à direita, o conjunto de resultados conterá valores NULL para as colunas da tabela à direita. A palavra-chave OUTER pode ser omitida e a junção pode ser escrita simplesmente como LEFT JOIN. O oposto de um LEFT OUTER JOIN é um RIGHT OUTER JOIN, que retorna todas as linhas da tabela direita e as linhas correspondentes da tabela esquerda.

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column = table2.column;
```

A consulta a seguir retornará todas as linhas da tabela de clientes, junto com as linhas correspondentes da tabela de pedidos. Se um cliente não tiver pedidos, o conjunto de resultados ainda incluirá as informações desse cliente, com valores NULL para as colunas order\$1id e order\$1date.

```
SELECT customers.customer_id, customers.name, orders.order_id, orders.order_date
FROM customers
LEFT OUTER JOIN orders
ON customers.customer_id = orders.customer_id;
```

A consulta a seguir é uma junção externa à esquerda. Junções externas esquerdas e direitas retêm valores de uma das tabelas de junção quando nenhuma correspondência é encontrada na outra tabela. As tabelas esquerdas e direitas são a primeiras e a segunda listadas na sintaxe. Os valores NULL são usados para preencher "lacunas" no conjunto de resultados. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTIDs 2 e 3 não resultaram em nenhuma venda.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing left outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

## DIREITO [EXTERNO]
<a name="right-outer-join"></a>

Retorna todos os valores da referência da tabela à direita e os valores correspondentes da referência da tabela à esquerda ou acrescenta NULL se não houver correspondência. Também é conhecida como *junção externa direita*.

Ele retorna todas as linhas da tabela direita (segunda) e as linhas correspondentes da tabela esquerda (primeira). Se não houver correspondência na tabela à esquerda, o conjunto de resultados conterá valores NULL para as colunas da tabela à esquerda. A palavra-chave OUTER pode ser omitida e a junção pode ser escrita simplesmente como RIGHT JOIN. O oposto de um RIGHT OUTER JOIN é um LEFT OUTER JOIN, que retorna todas as linhas da tabela esquerda e as linhas correspondentes da tabela direita.

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column = table2.column;
```

A consulta a seguir retornará todas as linhas da tabela de clientes, junto com as linhas correspondentes da tabela de pedidos. Se um cliente não tiver pedidos, o conjunto de resultados ainda incluirá as informações desse cliente, com valores NULL para as colunas order\$1id e order\$1date.

```
SELECT orders.order_id, orders.order_date, customers.customer_id, customers.name
FROM orders
RIGHT OUTER JOIN customers
ON orders.customer_id = customers.customer_id;
```

A consulta a seguir é uma junção externa à direita. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTIDs 1, 4 e 5 correspondem aos critérios.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing right outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

## COMPLETO [EXTERNO]
<a name="full-join"></a>

Retorna todos os valores de ambas as relações, anexando valores NULL no lado que não tem correspondência. Também é conhecida como *junção externa completa*. 

Ele retorna todas as linhas das tabelas esquerda e direita, independentemente de haver uma correspondência ou não. Se não houver correspondência, o conjunto de resultados conterá valores NULL para as colunas da tabela que não têm uma linha correspondente. A palavra-chave OUTER pode ser omitida e a junção pode ser escrita simplesmente como FULL JOIN. O FULL OUTER JOIN é menos comumente usado do que o LEFT OUTER JOIN ou o RIGHT OUTER JOIN, mas pode ser útil em determinados cenários em que você precisa ver todos os dados das duas tabelas, mesmo que não haja correspondências.

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
FULL [OUTER] JOIN table2
ON table1.column = table2.column;
```

A consulta a seguir retornará todas as linhas das tabelas de clientes e pedidos. Se um cliente não tiver pedidos, o conjunto de resultados ainda incluirá as informações desse cliente, com valores NULL para as colunas order\$1id e order\$1date. Se um pedido não tiver nenhum cliente associado, o conjunto de resultados incluirá esse pedido, com valores NULL para as colunas customer\$1id e name.

```
SELECT customers.customer_id, customers.name, orders.order_id, orders.order_date
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id;
```

A consulta a seguir é uma junção completa. As junções completas retêm valores das tabelas unidas quando nenhuma correspondência é encontrada na outra tabela. As tabelas esquerdas e direitas são a primeiras e a segunda listadas na sintaxe. Os valores NULL são usados para preencher "lacunas" no conjunto de resultados. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTIDs 2 e 3 não resultaram em nenhuma venda.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

A consulta a seguir é uma junção completa. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Somente as linhas que não resultam em nenhuma venda (LISTIDs 2 e 3) estão nos resultados.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
and (listing.listid IS NULL or sales.listid IS NULL)
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     2 | NULL   | NULL
     3 | NULL   | NULL
```

## [ESQUERDA] SEMI
<a name="left-semi-join"></a>

Retorna valores do lado esquerdo da referência da tabela que coincidem com o direito. Também é conhecida como *junção semi esquerda*. 

Ele retorna somente as linhas da tabela esquerda (primeira) que têm uma linha correspondente na tabela direita (segunda). Ele não retorna nenhuma coluna da tabela à direita - somente as colunas da tabela à esquerda. O LEFT SEMI JOIN é útil quando você deseja encontrar as linhas em uma tabela que coincidem em outra tabela, sem precisar retornar nenhum dado da segunda tabela. O LEFT SEMI JOIN é uma alternativa mais eficiente ao uso de uma subconsulta com uma cláusula IN ou EXISTS.

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
LEFT SEMI JOIN table2
ON table1.column = table2.column;
```

A consulta a seguir retornará somente as colunas customer\$1id e name da tabela de clientes, para os clientes que têm pelo menos um pedido na tabela de pedidos. O conjunto de resultados não incluirá nenhuma coluna da tabela de pedidos.

```
SELECT customers.customer_id, customers.name
FROM customers
LEFT SEMI JOIN orders
ON customers.customer_id = orders.customer_id;
```

## CROSS JOIN
<a name="cross-join"></a>

Retorna o produto cartesiano de duas relações. Isso significa que o conjunto de resultados conterá todas as combinações possíveis de linhas das duas tabelas, sem nenhuma condição ou filtro aplicado.

O CROSS JOIN é útil quando você precisa gerar todas as combinações possíveis de dados de duas tabelas, como no caso da criação de um relatório que exibe todas as combinações possíveis de informações do cliente e do produto. O CROSS JOIN é diferente de outros tipos de junção (INNER JOIN, LEFT JOIN etc.) porque não tem uma condição de junção na cláusula ON. A condição de junção não é necessária para um CROSS JOIN.

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
CROSS JOIN table2;
```

A consulta a seguir retornará um conjunto de resultados que contém todas as combinações possíveis de customer\$1id, customer\$1name, product\$1id e product\$1name das tabelas de clientes e produtos. Se a tabela de clientes tiver 10 linhas e a tabela de produtos tiver 20 linhas, o conjunto de resultados do CROSS JOIN conterá 10 x 20 = 200 linhas.

```
SELECT customers.customer_id, customers.name, products.product_id, products.product_name
FROM customers
CROSS JOIN products;
```

A consulta a seguir é uma junção cruzada ou junção cartesiana da tabela LISTING e da tabela SALES com um predicado para limitar os resultados. Essa consulta corresponde aos valores da coluna LISTID na tabela SALES e na tabela LISTING para LISTIDs 1, 2, 3, 4 e 5 em ambas as tabelas. Os resultados mostram que 20 linhas correspondem aos critérios.

```
select sales.listid as sales_listid, listing.listid as listing_listid
from sales cross join listing
where sales.listid between 1 and 5
and listing.listid between 1 and 5
order by 1,2;

sales_listid | listing_listid
-------------+---------------
1            | 1
1            | 2
1            | 3
1            | 4
1            | 5
4            | 1
4            | 2
4            | 3
4            | 4
4            | 5
5            | 1
5            | 1
5            | 2
5            | 2
5            | 3
5            | 3
5            | 4
5            | 4
5            | 5
5            | 5
```

## ANTI-JUNÇÃO
<a name="anti-join"></a>

Retorna os valores da referência da tabela à esquerda que não têm correspondência com a referência da tabela à direita. Também é conhecido como *anti-junção esquerda*.

O ANTI JOIN é uma operação útil quando você deseja encontrar as linhas em uma tabela que não coincidem em outra tabela. 

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
LEFT ANTI JOIN table2
ON table1.column = table2.column;
```

A consulta a seguir retornará todos os clientes que não fizeram nenhum pedido.

```
SELECT customers.customer_id, customers.name
FROM customers
LEFT ANTI JOIN orders
ON customers.customer_id = orders.customer_id
WHERE orders.order_id IS NULL;
```

## NATURAL
<a name="natural-join"></a>

Especifica que as linhas das duas relações serão correspondidas implicitamente em igualdade para todas as colunas com nomes correspondentes. 

Ele combina automaticamente colunas com o mesmo nome e tipo de dados entre as duas tabelas. Não é necessário especificar explicitamente a condição de junção na cláusula ON. Ele combina todas as colunas correspondentes entre as duas tabelas no conjunto de resultados.

O NATURAL JOIN é uma abreviatura conveniente quando as tabelas que você está unindo têm colunas com os mesmos nomes e tipos de dados. No entanto, geralmente é recomendável usar o INNER JOIN mais explícito... Sintaxe ON para tornar as condições de junção mais explícitas e fáceis de entender.

**Sintaxe:**

```
SELECT column1, column2, ..., columnn
FROM table1
NATURAL JOIN table2;
```

O exemplo a seguir é uma junção natural entre duas tabelas `employees` e`departments`, com as seguintes colunas: 
+ `employees`tabela:`employee_id`,`first_name`,`last_name`, `department_id `
+ `departments`tabela:`department_id`, `department_name `

A consulta a seguir retornará um conjunto de resultados que inclui o nome, o sobrenome e o nome do departamento para todas as linhas correspondentes entre as duas tabelas, com base na `department_id` coluna.

```
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
NATURAL JOIN departments d;
```

O exemplo a seguir é uma junção natural entre duas tabelas. Nesse caso, as colunas listid, sellerid, eventid e dateid têm nomes e tipos de dados idênticos em ambas as tabelas e, portanto, são usadas como colunas de junção. Os resultados são limitados a cinco linhas.

```
select listid, sellerid, eventid, dateid, numtickets
from listing natural join sales
order by 1
limit 5;

listid | sellerid  | eventid | dateid | numtickets
-------+-----------+---------+--------+-----------
113    | 29704     | 4699    | 2075   | 22
115    | 39115     | 3513    | 2062   | 14
116    | 43314     | 8675    | 1910   | 28
118    | 6079      | 1611    | 1862   | 9
163    | 24880     | 8253    | 1888   | 14
```