Entendendo o comando Join SLQ
Fala galera! Venho aqui neste post, mostrar à você que não entendei muito dos comandos Joins em sql como eles funcionam, e assim, desmitificar essa parada! Vamos lá.
Joins SQL são usados em uma consulta SQL para recuperar dados de várias tabelas. A SQL JOIN é efetuada sempre que duas ou mais tabelas são unidas em uma instrução SQL.
Existem 4 tipos diferentes de SQL join:
Joins SQL são usados em uma consulta SQL para recuperar dados de várias tabelas. A SQL JOIN é efetuada sempre que duas ou mais tabelas são unidas em uma instrução SQL.
Existem 4 tipos diferentes de SQL join:
- SQL INNER JOIN (ou às vezes chamado de join simples)
- SQL LEFT OUTER JOIN (ou às vezes chamado LEFT JOIN)
- SQL RIGHT OUTER JOIN (ou às vezes chamado RIGHT JOIN)
- SQL FULL OUTER JOIN (ou às vezes chamado FULL JOIN)
Você já deve ter escrito uma instrução SQL que usa um INNER JOIN. É o tipo mais comum de Join. SQL INNER JOINS retornam todas as linhas de várias tabelas onde a condição de junção é satisfeita.
SQL INNER JOIN SINTAXE
A sintaxe para o SQL INNER JOIN é:
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
ILUSTRAÇÃO VISUAL DE SQL INNER JOIN
Neste diagrama visual, o SQL INNER JOIN retorna a área sombreada:

O SQL INNER JOIN retornaria os registros onde tabela1 e tabela2 se cruzam.
SQL INNER JOIN EXEMPLOS
Aqui está um exemplo de uma INNER SQL JOIN:
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Este SQL INNER JOIN iria retornar todas as linhas dos fornecedores e mesas de encomendas onde há um valor supplier_id correspondente em ambos os fornecedores e mesas de ordens.
Vejamos alguns dados para explicar como o INNER JOINS trabalham:
Nós temos uma tabela chamada Suppliers com dois campos (supplier_id supplier_name). Ele contém os seguintes dados:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
Nós temos uma outra tabela chamada orders com três campos (ORDER_ID, supplier_id e order_date). Ele contém os seguintes dados:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 2003/05/12 |
500126 | 10001 | 2003/05/13 |
500127 | 10004 | 2003/05/14 |
Se executar a instrução SQL (que contém um INNER JOIN) abaixo:
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Nosso conjunto de resultados ficaria assim:
supplier_id | nome | order_date |
---|---|---|
10000 | IBM | 2003/05/12 |
10001 | Hewlett Packard | 2003/05/13 |
As linhas para Microsoft e NVIDIA da tabela do Suppliers seria omitida, desde 10002 e 10003 não existem do supplier_id em ambas as tabelas. A linha para 500127 (order_id) da tabela de ordens seria omitido, uma vez que o 10004 supplier_id não existe na tabela de fornecedores.
ANTIGO SQL SINTAXE INNER JOIN
Como nota final, vale a pena mencionar que o SQL INNER JOIN acima poderia ser reescrita usando a sintaxe implícita mais velha da seguinte forma (mas ainda recomendo usar o INNER JOIN com palavra-chave):
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id;
SQL LEFT OUTER JOIN
Outro tipo de associação é chamada de LEFT OUTER JOIN . Este tipo de JOIN retorna todas as linhas da tabela da esquerda especificadas na condição ON e apenas as linhas da outra tabela onde os campos associados são iguais (se a junção da condição for atendida).
SQL LEFT OUTER JOIN SINTAXE
A sintaxe para o SQL LEFT OUTER JOIN é:
SELECT columns FROM table1 LEFT [OUTER] JOIN table2 ON table1.column = table2.column;
Em alguns bancos de dados, o LEFT OUTER JOIN com palavras-chave são substituídos por LEFT JOIN.
VISUAL ILUSTRAÇÃO DE SQL LEFT OUTER JOIN
Neste diagrama visual, o SQL LEFT OUTER JOIN retorna a área sombreada:

O SQL LEFT OUTER JOIN retornaria os todos os registros da tabela 1 e somente os registros da tabela2 que se cruzam com a tabela 1 .
SQL LEFT OUTER JOIN EXEMPLOS
Aqui está um exemplo de um SQL junção externa esquerda:
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Este LEFT OUTER JOIN iria retornar todas as linhas da tabela de Suppliers e apenas as linhas da tabela de pedidos, onde os campos associados são iguais.
Se um valor supplier_id na tabela de Suppliers não existe na tabela de pedidos, todos os campos na tabela de orders será exibido como <null> no conjunto de resultados.
Vejamos alguns dados para explicar como LEFT OUTER JOINS trabalham:
Nós temos uma tabela chamada Suppliers com dois campos (supplier_id e supplier_nome). Ele contém os seguintes dados:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
Temos uma segunda tabela chamada orders com três campos (ORDER_ID, supplier_id e order_date). Ele contém os seguintes dados:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 2003/05/12 |
500126 | 10001 | 2003/05/13 |
Se executarmos a instrução SQL (que contém uma associação externa à esquerda):
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Nosso conjunto de resultados ficaria assim:
supplier_id | supplier_name | order_date |
---|---|---|
10000 | IBM | 2003/05/12 |
10001 | Hewlett Packard | 2003/05/13 |
10002 | Microsoft | <null> |
10003 | NVIDIA | <null> |
As linhas para Microsoft e NVIDIA seriam incluída porque um LEFT OUTER JOIN foi usado. No entanto, você vai notar que o campo order_date para esses registros contém um valor <null>.
ANTIGa SINTAXE SQL LEFT OUTER JOIN
Como nota final, vale a pena mencionar que o LEFT OUTER JOIN acima poderia ser reescrito usando a sintaxe implícita mais velha que utiliza o operador de junção externa (+) da seguinte forma (mas ainda recomendamos o uso do LEFT OUTER JOIN com palavra-chave):
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id(+);
SQL RIGHT OUTER JOIN
Outro tipo de associação é chamada de SQL RIGHT OUTER JOIN . Este tipo de JOIN retorna todas as linhas da tabela do lado direito especificados na condição ON e apenas as linhas da outra tabela onde os campos associados são iguais (se a junção da condição for atendida).
RIGHT OUTER JOIN SQL SINTAXE
A sintaxe para o SQL RIGHT OUTER JOIN é:
SELECT columns FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column = table2.column;
Em alguns bancos de dados, o RIGHT OUTER JOIN com palavras-chave são substituídos por RIGHT JOIN.
VISUAL ILUSTRAÇÃO DE SQL RIGHT OUTER JOIN
Neste diagrama visual, o SQL RIGHT OUTER JOIN retorna a área sombreada:

O SQL RIGHT OUTER JOIN retornaria os todos os registros da tabela2 e somente os registros da tabela 1 que se cruzam com tabela2 .
SQL RIGHT OUTER JOIN EXEMPLOS
Aqui está um exemplo de um SQL rigth outer join:
SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Este RIGHT OUTER JOIN retornaria todas as linhas da tabela de pedidos e apenas as linhas da tabela de suppliers, onde os campos associados são iguais.
Se um valor supplier_id na tabela de pedidos não existe na tabela de suppliers, todos os campos na tabela de suppliers seram apresentado como <null> no conjunto de resultados.
Vejamos alguns dados para explicar como RIGHT OUTER JOINS trabalham:
Nós temos uma tabela chamada suppliers com dois campos (supplier_id e supplier_nome). Ela contém os seguintes dados:
supplier_id | supplier_name |
---|---|
10000 | Maçã |
10001 |
Temos uma segunda tabela chamada orders com três campos (ORDER_ID, supplier_id e order_date). Ela contém os seguintes dados:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 2013/08/12 |
500126 | 10001 | 2013/08/13 |
500127 | 10002 | 2013/08/14 |
Se executar a instrução SQL (que contém uma rigth outer join) abaixo:
SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Nosso conjunto de resultados ficaria assim:
order_id | order_date | supplier_name |
---|---|---|
500125 | 2013/08/12 | Maçã |
500126 | 2013/08/13 | |
500127 | 2013/08/14 | <null> |
A linha para 500127 (order_id) seriam incluídas porque um RIGHT OUTER JOIN foi usado. No entanto, você vai notar que o campo supplier_name para esse registro contém um valor <null>.
ANTIGO SINTAXE SQL RIGHT OUTER JOIN
Como nota final, vale a pena mencionar que o RIGHT OUTER JOIN acima poderia ser reescrito usando a sintaxe implícita mais velha que utiliza o operador de junção externa (+) da seguinte forma (mas ainda recomendo usar o RIGHT OUTER JOIN com palavra-chave):
SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers, orders
WHERE suppliers.supplier_id(+) = orders.supplier_id;
SQL FULL OUTER JOIN
Outro tipo de associação é chamado de SQL FULL OUTER JOIN . Este tipo de JOIN retorna todas as linhas da tabela do lado esquerdo e do lado direito da tabela com valores nulos no lugar onde a condição de junção não é satisfeita.
SQL FULL OUTER SINTAXE JOIN
A sintaxe para o SQL FULL OUTER JOIN:
SELECT columns FROM table1 FULL [OUTER] JOIN table2 ON table1.column = table2.column;
Em alguns bancos de dados, o FULL OUTER JOIN são substituídos por FULL JOIN.
VISUAL ILUSTRAÇÃO DE SQL FULL OUTER JOIN
Neste diagrama visual, o SQL FULL OUTER JOIN retorna a área sombreada:

O SQL FULL OUTER JOIN retornaria os todos os registros de ambos tabela1 e tabela2 .
SQL FULL OUTER JOIN EXEMPLOS
Aqui está um exemplo de um SQL FULL OUTER JOIN:
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers FULL OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Este FULL OUTER JOIN retorna todas as linhas da tabela de suppliers e todas as linhas da tabela de pedidos e sempre que a condição de junção não for atendida, <nulls> seriam estendidas aos campos no conjunto de resultados.
Se um valor supplier_id na tabela de suppliers não existe na tabela de pedidos, todos os campos na tabela de orders seriam exibidos como <null> no conjunto de resultados. Se um valor supplier_id na tabela de pedidos não existe na tabela de suppliers, todos os campos na tabela de suppliers seram apresentados como <null> no conjunto de resultados.
Vejamos alguns dados para explicar como FULL OUTER JOINS:
Nós temos uma tabela chamada fornecedores com dois campos (supplier_id e supplier_nome). Ele contém os seguintes dados:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
Temos uma segunda tabela chamada orders com três campos (ORDER_ID, supplier_id e order_date). Ele contém os seguintes dados:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 2013/08/12 |
500126 | 10001 | 2013/08/13 |
500127 | 10004 | 2013/08/14 |
Se executar a instrução SQL (que contém uma full outer join) a seguir:
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers FULL OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;
Nosso conjunto de resultados ficaria assim:
supplier_id | supplier_name | order_date |
---|---|---|
10000 | IBM | 2013/08/12 |
10001 | Hewlett Packard | 2013/08/13 |
10002 | Microsoft | <null> |
10003 | NVIDIA | <null> |
<null> | <null> | 2013/08/14 |
As linhas para Microsoft e NVIDIA seriam incluídas porque um full outer join foi usado. No entanto, você vai notar que o campo order_date para esses registros contém um valor <null>.
A linha para supplier_id 10004 seriam também incluídos porque um full outer join foi usado. No entanto, você vai notar que o supplier_id e campo supplier_name para esses registros contêm um valor <null>.
Veja agora este diagrama para memorizar de uma vez por todas como estas funções trabalham:
É isso ai galera, espero que tenham gostado! Até a próxima!
De seu amigo Bruno Rafael.
Comentários
Postar um comentário