quarta-feira, 19 de fevereiro de 2014

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:

  • 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:

SQL

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_idsupplier_name
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

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_idsupplier_idorder_date
500125100002003/05/12
500126100012003/05/13
500127100042003/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_idnomeorder_date
10000IBM2003/05/12
10001Hewlett Packard2003/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:

SQL

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_idsupplier_name
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

Temos uma segunda tabela chamada orders com três campos (ORDER_ID, supplier_id e order_date). Ele contém os seguintes dados:

order_idsupplier_idorder_date
500125100002003/05/12
500126100012003/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_idsupplier_nameorder_date
10000IBM2003/05/12
10001Hewlett Packard2003/05/13
10002Microsoft<null>
10003NVIDIA<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:

SQL

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_idsupplier_name
10000Maçã
10001Google

Temos uma segunda tabela chamada orders com três campos (ORDER_ID, supplier_id e order_date). Ela contém os seguintes dados:

order_idsupplier_idorder_date
500125100002013/08/12
500126100012013/08/13
500127100022013/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_idorder_datesupplier_name
5001252013/08/12Maçã
5001262013/08/13Google
5001272013/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:

SQL

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_idsupplier_name
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

Temos uma segunda tabela chamada orders com três campos (ORDER_ID, supplier_id e order_date). Ele contém os seguintes dados:

order_idsupplier_idorder_date
500125100002013/08/12
500126100012013/08/13
500127100042013/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_idsupplier_nameorder_date
10000IBM2013/08/12
10001Hewlett Packard2013/08/13
10002Microsoft<null>
10003NVIDIA<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.

Nenhum comentário:

Postar um comentário

Admin: Bruno

Olá Galera! muito grato por estarem acessando nosso blog. Espero que seja possível transmitir de forma compreensível um pouco de meus conhecimentos em programação, para esta comunidade de desenvolvedores que cresce cada vez mais! Espero que Gostem! Abraço! E meu enorme obrigado à Renato Simões, Átila Soares,Wanderson Quinto, Emerson e a toda galera que sempre ajudou meu sincero obrigado....
Especialmente a Natalia Failache e Rita de Cassia que sempre apoiaram este sonho....

De seu amigo Bruno Rafael.