Pela União dos seus poderes..

Fala aee pessoal, espero que estejam todos ótimos !!

Nos posts passados conversamos um pouco sobre índices, sua importância e como ele ajuda no desempenho da query. Bom, mostrei o blog para alguns amigos, na grande maioria desenvolvedores, que sequer sabiam da existência de índices. (Malditos ORM’s : ) ).

Bom, depois de conversar com eles e lembrar que até junho do ano passado (2020), eu também passava por isso, resolvi escrever algo um pouco diferente.


Vamos criar o cenário!

Criaremos uma tabela de produtos

use Estudos

CREATE TABLE Produtos ( 
	Codigo int,
	Descricao varchar(50)
)

Agora vamos inserir alguns registros na nossa tabela

INSERT INTO PRODUTOS(CODIGO, DESCRICAO) VALUES (1, 'CADERNO')
INSERT INTO PRODUTOS(CODIGO, DESCRICAO) VALUES (2, 'LAPIS')
INSERT INTO PRODUTOS(CODIGO, DESCRICAO) VALUES (3, 'REGUA')
INSERT INTO PRODUTOS(CODIGO, DESCRICAO) VALUES (4, 'BORRACHA')
INSERT INTO PRODUTOS(CODIGO, DESCRICAO) VALUES (5, 'CANETA')

Agora criaremos uma tabela de PrecoProdutos

CREATE TABLE PrecoProdutos ( 
	Codigo int,
	CodigoProduto int,
	Valor decimal(5,2)
)

Obs.: Não criaremos chaves propositalmente.

INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (1,1,10)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (2,1,15)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (3,1,12)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (4,2,0.50)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (5,2,0.65)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (6,2,0.70)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (7,3,1.20)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (8,10,15)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (8,11,22)
INSERT INTO PrecoProdutos(Codigo,CodigoProduto,Valor) VALUES (8,13,35)

Analisaremos em seguida os registros encontrados nas 2 tabelas;

select Codigo, Descricao from Produtos

Select Codigo, CodigoProduto,Valor from PrecoProdutos

Podemos analisar que a coluna CodigoProduto da tabela PrecoProdutos se equivale a coluna Codigo da Tabela Produtos, (poderíamos criar um relacionamento entre chaves, explicaremos isto em outro post, prometo 🙂 ).

Pois bem, com esta análise, identificamos que o produto 1, Caderno possui 3 preços diferentes, o produto 2, Lápis também tem 3 preços diferentes, etc.

Como faremos para “unir” as 2 tabelas?


Entendendo

Segundo a documentação da própria Microsoft: “ Usando junções, é possível recuperar dados de duas ou mais tabelas com base em relações lógicas entre as tabelas. Junções indicam como SQL Server deveria usar dados de uma tabela para selecionar as linhas em outra tabela .

https://docs.microsoft.com/pt-br/sql/relational-databases/performance/joins?view=sql-server-ver15

Isso basicamente significa que campos que se relacionam entre duas ou mais tabelas distintas podem se unir/juntar.

Entendendo nossas tabelas já podemos afirmar que o Campo Codigo da tabela Produtos se relaciona com o campo CodigoProduto da tabela PrecoProdutos.

Com isso podemos dizer que o Codigo é igual CodigoProduto, Ithalo? Calma, calma, vamos entender de perto esta pergunta.


Com a união dos seus poderes…

Existem vários tipos de uniões no SQL, neste Post vamos entender 3 Tipos.

  • Inner Join: Quando usamos o inner join retornaremos na nossa pesquisa todos os resultados que se equivalem. Vamos entender ele “codando”;
Select * from Produtos INNER JOIN PRECOPRODUTOS 
ON PRECOPRODUTOS.CodigoProduto = PRODUTOS.CODIGO

Quando executamos esta query, estamos dizendo para o SQL o seguinte: “SQL retorne todos os registros onde o código da tabela produto é exatamente igual ao codigoProduto da tabela PrecoProduto.

Que maravilha!!! Exatamente o que nós precisamos Ithalo! Show!!

Opa, opa, opa, calminha aí. Vamos olhar novamente o conteúdo das nossas 2 tabelinhas?

Temos 2 registros na tabela Produto (Borracha e Caneta), que simplesmente não retornaram na nossa query, o que será que aconteceu?

– Quando usamos o inner join, estamos “pedindo” para que o SQL, retorne exatamente aqueles registros que são idênticos. Como a Borracha e a Caneta, não possuem preço na tabela PrecoProdutos, estes registros simplesmente não serão exibidos.

E agora Ithalo, eu preciso exibir inclusive os produtos sem preço, como faço?

  • Left Join: Bom, precisamos retornar todos registros da tabela Produtos, independente se os mesmos possuem preço ou não. Na nossa query, podemos perceber que a primeira tabela após o FROM, é a tabela Produtos, portanto ela está à esquerda da tabela PreçoProdutos, basta então que alteremos a clausula inner, pela clausula left.

Vamos ver?

Select * from Produtos LEFT JOIN PRECOPRODUTOS 
ON PRECOPRODUTOS.CodigoProduto = PRODUTOS.CODIGO
“Vualá”. Exatamente o que queríamos. Ou seja, o Left Join exibe todos os registros que existem na tabela a esquerda, independente se os mesmos possuem equivalência.

Se você chegou até aqui e entendeu, o próximo Join, você já sabe como funciona sem mesmo ler né? Pois é, você está absolutamente certo. E agora o resto do post fica sem graça. Droga : ‘(

  • Right Join: Se observarmos nossa tabela PrecoProdutos de perto, podemos observar que existem preços de produtos que não existem na nossa tabela de produtos, (este problema seria resolvido com integridade). E como faremos para exibi-los? Duvido que você saiba.
Select * from Produtos RIGHT JOIN PRECOPRODUTOS 
ON PRECOPRODUTOS.CodigoProduto = PRODUTOS.CODIGO

Como era esperado, está aí nosso resultado. O Right Join exibe todos os registros que existem na tabela a direita, independente se os mesmos possuem equivalência.

Espero que tenham gostado.

Um abraço!!

E até a próxima!!!

1 comentário

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *