Lesson 2: Joining Related Tables


Using the JOIN Operator

No nosso dia a dia veremos que para podermos ter um resultado único de informações, a grande maioria das vezes as informaçãoes estarão em duas ou mais tabelas.

Nesta lição veremos como utilizar os operadores JOIN e com isso resgatar estas informações e transformá-las em um resultado único. Para isso veremos como utilizar os operaores INNER, OUTER, FULL, e o CROSS JOIN e a diferença entre eles.

Defining Inner Joins

O operador JOIN permite que você retorne dados armazenados em multiplas tabelas relacionadas e para isso basta que pelo menos uma coluna em cada uma das tabelas tenham o mesmo significado para podermos obter um resultado coerente.

Vejamos agora um exemplo para entendermos como é a estrutura simples do uso de um operador JOIN.

SELECT AddressLine1, City, PostalCode
      , S.StateProvinceCode, S.Name
FROM Person.Address A INNER JOIN Person.StateProvince S
     ON  A.StateProvinceID = S.StateProvinceID
ORDER BYS.StateProvinceCode;
Fig. 13 - Primeiro exemplo com INNER JOIN

Fig. 13 - Primeiro exemplo com INNER JOIN

Neste primeiro exemplo nós trabalhamos com apenas duas tabelas (PersonAddress e Person.StateProvince) e o objetivo foi unificar em um único resultado informações de ambas as tabelas utilizando como critério o relacionamento existente entre ambas à partir da coluna StateProvinceID.

Para chegarmos ao resultado da Fig. 13 definimos as seguintes ”regras”: Primeiramente definimos as colunas que seriam exibidas (note o uso de aliases/apelido nas colunas da tabela Person.StateProvince ) em seguida definimos qual operador JOIN utilizaremos e qual o critério da junção, neste caso nosso critério é a igualdade de valores entre os campos  StateProvinceID de ambas as tabelas, ou seja, a pesquisa retornou todas as linhas cujas colunas StateProvinceID possuam o mesmo valor nas duas tabelas, caso uma destas tabelas possua um valor que não exista na outra, estas informações não serão retornadas .

Defining Outer Joins

O OUTER JOIN é utilizado para retornar todos os registros de uma tabela e e apenas informações de linhas que sejam em comum da outra tabela, ou ainda, pode retornar todas as linhas de todas as tabelas na cláusula JOIN.

Existem três tipos de OUTER JOIN: LEFT OUTER JOIN, RIGHT OUTER JOIN ou FULL OUTER JOIN,  porém podemos omitir a palavra OUTER da sintaxe e trabalharmos apenas com LEFT JOIN, RIGHT JOIN ou FULL JOIN.

Abaixo veremos um exemplo de cada, utilizando a mesma s sintaxe alterando apenas o operador JOIN para vermos qual a diferença no resultado:

1 – Utilizando o LEFT JOIN

USE AdventureWorks;
Select P.FirstName + ' ' + P.LastName AS 'Nome Completo'       , E.VacationHours AS 'Férias (em horas)'       , E.SickLeaveHours AS 'Afastamento por Doença (em horas)'       , E.Title AS 'Função', E.LoginID AS 'Login'
FROM HumanResources.Employee E LEFT JOIN Person.Contact P
      ON E.ContactID = P.ContactID
ORDER BY [Nome Completo];
Fig. 14 - Exemplo de LEFT JOIN

Fig. 14 - Exemplo de LEFT JOIN

Antes de montarmos nossa query definimos qual banco de dados estaremos utilizando nos exemplos, nestes exemplos utilizaremos o BD AdventureWorks.

Para chegarmos no resultado acima, primeiramente definimos quais as colunas de cada tabela seriam exibidas, em seguida definimos o operador LEFT JOIN  e qual seria o critério da junção, no nosso caso serão as colunas ContactID que devem conter valores iguais em ambas as tabelas e finalizando ordenamos nossa pesquisa pela coluna [Nome Completo].

Neste caso serão exibidas todas as linhas da tabela definida à ESQUERDA do operador LEFT JOIN (tabela HumanResources.Employee, veja que já não estamos mais utilizando o OUTER) com os valores correspondentes à tabela da direita (tabela Person.Contact), portanto todos os registros da tabela da direita que não possuem seus correspondentes na tabela da esquerda não serão exibidos.

2 – Utilizando o RIGHT JOIN

Select P.FirstName + ' ' + P.LastName AS 'Nome Completo'
      , E.VacationHours AS 'Férias (em horas)'
      , E.SickLeaveHours AS 'Afastamento por Doença (em horas)'
      , E.Title AS 'Função', E.LoginID AS 'Login'
FROM HumanResources.Employee E RIGHT JOIN Person.Contact P
      ON E.ContactID = P.ContactID
ORDER BY[Nome Completo];
Fig. 15 - Exemplo de RIGHT JOIN

Fig. 15 - Exemplo de RIGHT JOIN

Novamente definimos quais as colunas de cada tabela seriam exibidas, em seguida definimos o operador RIGHT JOIN  e qual seria o critério da junção, no nosso caso serão as colunas ContactID novamente que devem conter valores iguais em ambas as tabelas e finalizando ordenamos nossa pesquisa pela coluna [Nome Completo].

Neste caso serão exibidas todas as linhas da tabela definida à DIREITA do operador LEFT JOIN (tabela Person.Contact) com seus valores correspondentes à tabela da esquerda (tabela HumanResources.Employee), portanto todos os registros da tabela da esquerda que não possuem seus correspondentes na tabela da direita não serão exibidos.

Nota: Perceba que neste exemplo vários campos aparecem com valor NULL e suas células com uma coloração diferente, isso ocorre devido ao fato destas células não terem um valor correspondente na tabela HumanResources.Employee, falaremos mais sobre NULL posteriormente.

3 – Utilizando o FULL JOIN

Select P.FirstName + ' ' + P.LastName AS 'Nome Completo'
      , E.VacationHours AS 'Férias (em horas)'
      , E.SickLeaveHours AS 'Afastamento por Doença (em horas)'
      , E.Title AS 'Função', E.LoginID AS 'Login'
FROM HumanResources.Employee E FULL JOIN Person.Contact P
      ON E.ContactID = P.ContactID
ORDER BY[Nome Completo];
Fig. 16 - Exemplo com FULL JOIN

Fig. 16 - Exemplo com FULL JOIN

Novamente definimos quais as colunas de cada tabela seriam exibidas, em seguida definimos o operador FULL JOIN e qual seria o critério da junção, no nosso caso serão as colunas ContactID novamente que devem conter valores iguais em ambas as tabelas e finalizando ordenamos nossa pesquisa pela coluna [Nome Completo].

Neste caso serão exibidas todas as linhas de ambas as tabelas (tabelas Person.Contact e HumanResources.Employee) com seus valores correspondentes. Note que o número de linhas obtidos como resultado neste exemplo é o mesmo do exemplo anterior, isso ocorreu porque todos os registros da tabela Person.Contact possui um correspondente na tabela HumanResources.Employee.

Working with more than two tables

Até agora havíamos visto como trabalhar com JOIN somente com duas tabelas e à partir de agora passaremos a trabalhar com mais de duas.

O tipo mais comum de operação com JOIN utilizando mais que duas tabelas, é utilizando o INNER JOIN, vejamos abaixo um exemplo onde utilizamos 3 tabelas.

Select P.FirstName + ' ' + P.LastName AS 'Nome Completo'       , E.VacationHours AS 'Férias (em horas)'
      , E.SickLeaveHours AS 'Afastamento por Doença (em horas)'
      , E.Title AS 'Função', E.LoginID AS 'Login'
FROM HumanResources.Employee E
INNER JOIN Person.Contact P
      ON E.ContactID = P.ContactID
INNER JOIN HumanResources.EmployeePayHistory PA
      ON E.EmployeeID = PA.EmployeeID
ORDER BY[Nome Completo];
Fig. 17 - INNER JOIN com mais de 2 tabelas

Fig. 17 - INNER JOIN com mais de 2 tabelas

Defining a Self-Join

O SELF-JOIN ao contrário do exemplo anterior, é utilizado quando todas as informações que desejamos estão disponíveis em uma única tabela e seus campos referenciam-se entre sí, conseguindo assim obter o resultado desejado.

Para utilizarmos o SELF-JOIN, o “segredo”  é montarmos nossa query referenciando mais de uma vez a mesma tabela porém utilizando alias/apelidos diferentes.

Vejamos um exemplo abaixo :

USE AdventureWorksDW;

SELECT E.FirstName + ' ' + E.LastName AS 'Nome do Empregado'
     , DS.FirstName + ' ' + DS.LastName AS 'Supervisor Direto'
FROM DimEmployee E INNER JOIN DimEmployee DS
     ON E.ParentEmployeeKey = DS.EmployeeKey
ORDER BY [Nome do Empregado];
Fig. 18 - Exemplo de SELF JOIN

Fig. 18 - Exemplo de SELF JOIN

Nota: Este exemplo é o mesmo utilizado no Trainning Kit.

É isso pessoal chegamos ao fim de mais uma lição, espero que tenham aproveitado o conteúdo, se algo não ficou claro me avisem que publicarei exemplos com abordagens diferentes para que não fique nenhuma dúvida ok?

Agora é com vocês! Como já aprenderam a utilizar  o operador JOIN e suas variações, quero saber o que entenderam no exemplo Working with more two tables.

Aguardo os comentários de vocês,  em breve minha descrição sobre o exemplo!.

Abraço e sucesso a todos! 🙂

Lucas A. Romão

Anúncios

3 Responses to Lesson 2: Joining Related Tables

  1. Alan Lopes disse:

    Muito bom,
    Não entendi muito bem a LEFT JOIN e RIGHT JOIN, mas a aula é muito bom.. Parabéns

    • Opa muito obrigado pelo feedback Alan!

      Sempre é muito importante recebê-los, comente sempre!

      Quanto ao que não entendeu, pode postar suas dúvidas que tentarei esclarecer da melhor forma possível.

      Abs.

      Lucas A. Romão

  2. Ediney Souza disse:

    Olá Lucas, tudo bem?
    Comecei a estudar para a certificação e pesquisando na internet encontre este blog, a tua iniciativa foi incrível. Parabéns!
    Só uma observação,no inicio da Lição 2 você fala em Cross Join mas não há nenhum exemplo sobre a utilização de Cross Joins.

    Obrigado e mais uma vez parabéns.
    Ediney Souza

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: