Junções de tabelas no SQL Server – JOINS

 

Olá, neste post irei compartilhar com vocês sobre junções de tabelas. Usando junções, é possível recuperar dados de duas ou mais tabelas com base em relações lógicas entre as tabelas.

Uma das dificuldades dos iniciantes na linguagem SQL é a construção de consultas utilizando junções entre tabelas, um recurso fundamental para visualizar os dados de um banco relacional.

Para exemplificar, utilizaremos duas tabelas temporárias muito simples com apenas uma coluna do tipo inteiro em cada uma. Os exemplos mostrados foram criados no SQL Server 2012

CREATE TABLE #a (id INT)
-- Populando tabela A
INSERT INTO #a VALUES (1)
INSERT INTO #a VALUES (2)
INSERT INTO #a VALUES (4)
INSERT INTO #a VALUES (5)

-- Criando tabela B
CREATE TABLE #b (id INT)
--Populando a tabela B
INSERT INTO #b VALUES (1)
INSERT INTO #b VALUES (3)
INSERT INTO #b VALUES (4)
INSERT INTO #b VALUES (6)

INNER JOIN – Seleciona todas as linhas de ambas as tabelas, desde que haja uma correspondência entre as colunas em ambas as tabelas, retorna dados apenas quando as duas tabelas tem chaves correspondentes na cláusula ON do join. Usada quando se quer recuperar dados em mais de uma tabela através da igualdade de suas foreign keys.

i1Mvp

São retornadas todas as linhas das tabelas A e B que correspondam ao critério estabelecido na cláusula ON.

SELECT * FROM #a AS a
INNER JOIN #b AS b
ON A.id = B.id

Screenshot_49

LEFT JOIN – Com base nas duas tabelas especificadas na cláusula de junção, todos os dados são retornados da tabela à esquerda. Na tabela a direita, os dados correspondentes é devolvido, além de valores NULL, onde existe um registro na tabela à esquerda, mas não na tabela à direita

LeftJoin

Serão retornadas todas as linhas da primeira tabela, e apenas as linhas de B que atendam ao critério da junção.

SELECT * FROM #a AS a
LEFT JOIN #b AS b
ON A.id = B.id

Screenshot_50

RIGHT JOIN – Segue o mesmo raciocínio do Left Join, porém todos os dados são retornados da tabela à direita, e na tabela a esquerda os dados correspondentes é devolvido, além de valores NULL, onde existe um registro na tabela à direita, mas não na tabela à esquerda

RightJoin

O RIGHT JOIN é muito semelhante ao LEFT JOIN. A diferença fundamental é que serão retornadas todas as linhas da segunda tabela, e apenas as linhas de A que atendam ao critério da junção..

Screenshot_51

FULL OUTER JOIN – Conhecida como Outer Join ou simplesmente FULL JOIN, este retorna todos os registros de ambas as tabelas. O funcionamento do FULL JOIN pode ser considerado uma combinação do LEFT JOIN e o RIGHT JOIN

OuterJoin

[code language="sql"]
SELECT * FROM #a AS a
FULL JOIN #b AS b
ON A.id = B.id
[/code]

Screenshot_52

CROSS JOIN (método implícito) – Produz um produto cartesiano das tabelas e, por isso mesmo, não tem claúsula ON. O CROSS JOIN diferencia-se dos outros tipos de junção, pois não permite que seja especificada uma condição para a junção. Assim, o resultado será uma combinação de TODAS as linhas da primeira tabela com TODAS as linhas da segunda tabela.

crosjoin

[code language="sql"]
SELECT * FROM #a AS a
CROSS JOIN #b AS b
[/code]

Screenshot_53

Nesse outro exemplo, vou criar duas tabelas simples no banco de dados: Marcas e Carros. Vamos analisar as duas:

Screenshot_62

Screenshot_61

Perceba que temos 6 registros na tabela Marcas e 14 registros na tabela Carros

INNER JOIN –  Irá juntar os registros da tabela marca que tiver um correspondente na tabela carros. Essa correspondência é feita pelos campos marca que está presente nas duas tabelas.

SELECT M.Nome, C.Modelo FROM Marcas m
INNER JOIN Carros c
ON m.Marca = c.Marca

Screenshot_56

Apenas 10 registros satisfazem o inner join. Podemos dizer que 10 carros estão associados a alguma marca, enquanto que os demais não.

LEFT JOIN – Todos os registros da tabela marcas serão mostrados, independente de haver correspondência na tabela carros. Quando não houver correspondência na tabela carros, será mostrado o valor NULL ou nulo. Exemplo:

SELECT M.Nome, C.Modelo FROM Marcas m
LEFT JOIN Carros c
ON m.Marca = c.Marca

Screenshot_57

As marcas General Motors, Renault e Mercedes Bens não tem nenhum carro cadastrado, mesmo assim elas apareceram no resultado.

RIGHT JOIN – A junção right join funciona de forma inversa ao left join. Aplica-se o mesmo conceito, porém, de forma invertida. Com o right join será mostrado todos os carros, mesmo aqueles que não estejam associados a nenhum registro da tabela marcas. Exemplo:

SELECT M.Nome, C.Modelo FROM Marcas m
RIGHT JOIN Carros c
ON m.Marca = c.Marca

Screenshot_59

207 e ix25 são modelos que estão cadastrados em carros, mas não estão associados a nenhuma marca.

FULL OUTER JOIN

Seria o mesmo que left join e right join juntas, ou seja, ela irá mostrar todas as marcas e todos os carros, independente de existir valores correspondente na tabela oposta.

SELECT M.Nome, C.Modelo FROM Marcas m
FULL OUTER JOIN Carros c
ON m.Marca = c.Marca

CROSS JOIN

Essa junção faz um cruzamento das duas tabelas e me trará o resultado com 84 linhas, o que ele fará é basicamente como mostra nessa imagem.

EF70Z

Por hoje é isso, Valeu e até mais.



Escreva um comentário

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