Introdução aos JOINs - SQL
Tags: beginners, sql, mysql, braziliandevs
Published: 2022-03-04 21:25:22

## Tabela de Conteúdos

- [Join](#join)
- [`INNER JOIN`](#inner-join)
- [`LEFT JOIN` e `RIGHT JOIN`](#left-join-e-right-join)
- [Self Join](#self-join)
- [Links Úteis](#links-úteis)

---

## JOIN

### O que é?
É um comando do MySQL que permite a seleção de dados em mais de uma tabela, sendo possível manipular esses dados da mesma forma que fazíamos ao buscar em apenas uma tabela.

### Tipos
Existem 4 tipos de JOINs que serão abordados logo adiante.

- __[`INNER JOIN`](#inner-join)__
- __[`LEFT JOIN`](#left-join-e-right-join)__
- __[`RIGHT JOIN`](#left-join-e-right-join)__
- __[`SELF JOIN`](#self-join)__

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## INNER JOIN

### O que é?

É um comando que permite a seleção de informações em diferentes tabelas, desde que a informação em questão seja compartilhada por ambas.

### Sintaxe

A sintaxe do __`INNER JOIN`__ é relativamente simples, selecionamos as colunas que desejamos de cada tabela, assim como em um __`SELECT`__ comum.

Após definirmos as colunas que queremos, invocamos as tabelas da seguinte forma, a primeira deve ser chamada com o comando __`FROM`__, e apelidada com o __`AS`__ para facilitar referências, já a segunda deve ser chamada pelo comando __`INNER JOIN`__ e apelidada da mesma forma.

E por fim, depois de termos invocado as tabelas que queremos, precisamos dizer de forma explícita qual coluna esta sendo compartilhada por ambas as tabelas, para isso utilizamos o comando __`ON`__, seguido de uma comparação de igualdade.

``` sql
SELECT <t1>.<coluna1>, <t2>.<coluna2>, <t2>.<coluna3>
FROM <tabela1> AS <t1>
INNER JOIN <tabela2> AS <t2>
ON <t1>.<coluna em comum> = <t2>.<coluna em comum>;
```
``` sql
SELECT A.first_name, A.actor_id, F.actor_id
FROM sakila.actor AS A
INNER JOIN film_actor AS F
ON A.actor_id = F.actor_id;
```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## LEFT JOIN e RIGHT JOIN

### O que são?

São comandos de unificação de tabelas assim como o __`INNER JOIN`__, porém tanto o __`LEFT JOIN`__, quanto o __`RIGHT JOIN`__, não trazem só as informações que existem em ambas as tabelas, isso porque esses comandos priorizam uma das tabelas selecionadas e caso falte informação, eles automaticamente completam os valores faltantes com `Null`.

### Sintaxe
A sintaxe segue exatamente a mesma estrutura do __`INNER JOIN`__, sendo que a única diferença é que a ordem na qual definimos as tabelas importa.

Ao usarmos o __`LEFT JOIN`__ estamos priorizando a coluna que definimos a esquerda do JOIN, e ao usar o __`RIGHT JOIN`__ a coluna a ser priorizada passa a ser a da direita.

``` sql
SELECT <t1>.<coluna1>, <t2>.<coluna2>, <t3>.<coluna3>
FROM <tabela1> AS <t1>
LEFT JOIN <tabela2> AS <t2>
ON <t1>.<coluna em comum> = <t2>.<coluna em comum>;
```
``` sql
SELECT A.actor_id, C.costumer_id, C.first_name,
FROM sakila.actor AS A
LEFT JOIN sakila.customer AS C
ON A.last_name = C.last_name;
```
``` sql
SELECT <t1>.<coluna1>, <t2>.<coluna2>, <t3>.<coluna3>
FROM <tabela1> AS <t1>
RIGHT JOIN <tabela2> AS <t2>
ON <t1>.<coluna em comum> = <t2>.<coluna em comum>;
```
``` sql
SELECT A.actor_id, C.costumer_id, C.first_name,
FROM sakila.actor AS A
RIGHT JOIN sakila.customer AS C
ON A.last_name = C.last_name;
```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Self Join

### O que é?

O __`SELF JOIN`__ diferente dos outros JOINs que vimos até agora, isso por que ele não é um comando, mas sim um caso onde a tabela realiza um __JOIN__ consigo mesma. Sendo assim, podemos utilizar qualquer tipo de __JOIN__ visto anteriormente para aplicar um __`SELF JOIN`__.

### Sintaxe
A __sintaxe segue exatamente a dos JOINs anteriores__, sendo que a única diferença é que __iremos pegar dados de apenas um tabela__.

``` sql
SELECT
  CONCAT(Employee.FIRST_NAME, " ", Employee.LAST_NAME) AS "Nome da Pessoa Colaboradora",
  CONCAT(Manager.FIRST_NAME, " ", Manager.LAST_NAME) AS "Nome Gerente"
FROM sakila.employees AS Employee
INNER JOIN sakila.employees AS Manager
ON Employee.MANAGER_ID = Manager.EMPLOYEE_ID;
```

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

---

## Links Úteis

- [Dev Media - JOINs](https://www.devmedia.com.br/clausulas-inner-join-left-join-e-right-join-no-sql-server/18930)
- [MySQL Tutorial - INNER JOIN](https://www.mysqltutorial.org/mysql-inner-join.aspx)
- [SQL Bolt - Exercícios de JOIN](https://sqlbolt.com/lesson/select_queries_with_joins)

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>