SQL Server -  T-SQL - Consultando Múltiplas tabelas - JOIN (Junções)


 Este artigo aborda como realizar consultas em múltiplas tabelas usando o SQL Server (estou usando a versão 2012 Express ) de uma forma suscinta, prática  e objetiva.

 

É muito raro que uma base de dados tenha todos os seus dados em uma única tabela. Os dados tendem a estar espalhados por diversas tabelas de modo a otimizar o armazenamento e assegurar a coerência e integridade. Parte do seu trabalho ao escrever uma consulta é de implantar e interligar as operações de T-SQL que podem operar através de tabelas, a fim de gerar resultados de negócio necessários.

 

Para realizar tal tarefa podemos usar do seguintes blocos de construção:

  1. Join ou Junções 
    Em um banco de dados podemos ter duas ou mais tabelas relacionadas.
    Com frequência quando criamos uma consulta temos a necessidade de obter dados de mais de uma tabela.
    Para podermos realizar esta tarefa devemos definir critérios para agrupar os dados espalhados em diferentes tabelas.
    A esses critérios chamamos Junções ou Joins.
    Uma junção de tabelas cria uma pseudotabela derivada de duas ou mais tabelas de acordo com as regras especificadas, e que são parecidas com as regras da teoria dos conjuntos.

  1. Union ou União

    Na  SQL a cláusula UNION combina os resultados de duas consultas SQL em uma única tabela para todas as linhas correspondentes. As duas consultas devem resultar no mesmo número de colunas e em tipos de dados compatíveis com o objetivo de unirem-se. Quaisquer registros duplicados são automaticamente removidos a menos que UNION ALL seja usado.
    UNION
    pode ser útil em aplicações de data warehouse onde tabelas não são perfeitamente normalizadas. Um exemplo poderia ser um banco de dados com as tabelas Tabela1  e Tabela2 que possuem estruturas idênticas mas são separadas devido às considerações de desempenho. Uma consulta UNION poderia combinar resultados das duas tabelas.
    Observe que UNION não garante a ordem das linhas. As linhas do segundo operando podem aparecer antes, depois ou misturadas com as linhas do primeiro operando. Em situações onde uma ordem específica é desejada, a cláusula ORDER BY deve ser usada.
    Leve em conta que em alguns casos UNION ALL pode ser muito mais rápido que UNION.
     

  2. Subqueries ou SubConsultas

    Subconsulta ou consulta interna ou consulta aninhada é uma consulta em uma consulta.
    Uma subconsulta é geralmente adicionada na cláusula WHERE da instrução SQL.
    Na maioria das vezes, uma subconsulta é usada quando você sabe como procurar por um valor usando uma instrução SELECT, mas não sabe o valor exato.
    Subconsultas são uma maneira alternativa de retornar dados de múltiplas tabelas.
    Subconsultas podem ser usadas com as seguintes instruções
    SQL : SELECT, INSERT, UPDATE e DELETE , juntamente com os operadores de comparação como =, <,>,> =, <=, etc

As definições acima não são rigorosas elas apenas fornecem um começo para ajudar você a entender as operações. Vamos agora mostrar algumas exemplos de como obter dados de múltiplas tabelas usando a sintaxe T-SQL.

 

Eu estou usando o SQL Server Management Studio Express Edition :

 


Para executar as consultas abra o SQL Server Management Studio, efetue o login e a seguir clique em New Query ou tecle CTRL+N.

 

Será aberta a janela para você digitar a consulta T-SQL.

 

Após digitar clique em Execute e veja o resultado na janela logo abaixo.

 

Neste artigo vamos usar o banco de dados Northwind.mdf e o relacionamento existente entre as suas tabelas conforme mostra o diagrama abaixo:

 

Agora vamos ao trabalho:

 

 1- Retornando linhas relacionadas entre tabelas - INNER JOIN

 

O LEFT JOIN retorna todas as linhas de ambas as tabelas desde que haja uma correspondência entre as colunas em ambas as tabelas que atendam o critério de  junção definido.

 

Sintaxe:


 SELECT nome_coluna(s)
 FROM tabela1
 INNER JOIN tabela2
 ON tabela1.nome_coluna =tabela2.nome_coluna;
 


 SELECT nome_coluna(s)
 FROM tabela1
 INNER JOIN tabela2
 ON tabela1.nome_coluna =tabela2.nome_coluna;

 

 

Considere as tabelas Customers e Orders (Clientes e Pedidos). Note que existe um relacionamento entre as duas tabelas onde temos que um cliente esta relacionado com um pedido onde cada cliente pode ter zero, um ou vários pedidos.

 

Como podemos retornar linhas da tabela Customers e seus pedidos relacionados na tabela Orders ?

 

Para retornar linhas relacionadas entre tabelas para um única tabela utilize um critério INNER JOIN.

 

Uma junção interna ou INNER JOIN é uma associação em que os valores nas colunas que estão sendo unidas são comparados usando um operador de comparação.

 

No padrão ISO, associações internas podem ser especificados tanto na cláusula FROM como na cláusula WHERE. Este é o único tipo de junção que suporta o padrão ISO na cláusula WHERE.

 

Defina na cláusula FROM uma das tabelas:

 

FROM Customers.Customers

 

Adicione a palavra-chave INNER JOIN seguida do nome da outra tabela:

 

FROM Customers.Customers

     INNER JOIN Orders.Orders

 

Acrescente a cláusula ON e especifica a condição JOIN que identifica as combinações das linhas de nosso interesse.

 

FROM Customers.Customers

     INNER JOIN Orders.Orders

          ON Customers.CustomerID  = Orders.CustomerID

 

No exemplo é o campo CustomerID que identifica uma pessoa na tabela Customers e é o mesmo campo que identifica os pedidos para um cliente na tabela Orders.

 

Neste exemplo querermos todas as combinações das linhas de Customers e Orders que compartilham o mesmo valor para CustomerID.

 

Agora basta definir a cláusula SELECT e especificar os campos que queremos obter:

 

SELECT CustomerID, ContactName, City, Phone,

            OrderID, OrderDate, ShipCity

FROM Customers.Customers

     INNER JOIN Orders.Orders

          ON Customers.CustomerID  = Orders.CustomerID

 

Abaixo temos a consulta completa ,onde definimos um alias para as tabelas Customers e Orders, e o resultado obtido :

 

use Northwind

SELECT Clientes.CustomerID, Clientes.ContactName, Clientes.City, Clientes.Phone,
      
Pedidos.OrderID, Pedidos.OrderDate, Pedidos.ShipCity
FROM
Customers As Clientes
    
INNER JOIN Orders as Pedidos
         
ON Clientes.CustomerID = Pedidos.
CustomerID

 

 

 

Estamos retornando as colunas CustomerID, ContactName, City e Phone da tabela Customers e as colunas OrderID, OrderDate e ShipCity da tabela Orders.

 

Do ponto de vista conceitual, uma junção interna (INNER JOIN) começa com todas as combinações possíveis de linhas das duas  tabelas. Algumas combinações fazem sentido, algumas não. O conjunto de todas as combinações possíveis é chamado de produto cartesiano.

 

Podemos incluir a cláusula ORDER BY e realizar uma ordenação conforme a seguir onde ordenamos o resultado pela coluna ContactName da tabela Customers:

 

 

Podemos também usar outros operadores além do operador Equal na consulta com INNER JOIN.

 

No exemplo a seguir usamos o operador MAIOR QUE ( > ) onde definimos a condição de junção da seguinte forma:

ON Clientes.CustomerID = Pedidos.CustomerID AND Pedidos.Freight > 500.00

O resultado obtido mostra as 13 linhas que atendem a condição:

 

 

No exemplo a seguir usamos o operador MENOR QUE ( < ) para encontrar pedidos com frete menor que 30 para ao cliente com customerID igual a BERGS.
 


As associações internas ou INNER JOIN retornar as linhas apenas quando há pelo menos uma linha de ambas as tabelas que corresponde a condição de junção. Dessa forma elas eliminam as linhas que não correspondem a uma linha da outra tabela.

 

 2- Retornando linhas relacionadas entre tabelas - LEFT OUTER JOIN

 

Outer Joins ou associações externas, retornar todas as linhas a partir de pelo menos uma das tabelas ou views (exibições) mencionadas na cláusula FROM, contanto que essas linhas atendam às condições de busca das cláusulas WHERE ou HAVING.
 

O SQL Server usa as seguintes palavras-chave ISO para junções externas especificadas em uma cláusula FROM:

- LEFT OUTER JOIN ou LEFT JOIN
- RIGHT OUTER JOIN ou RIGHT JOIN
- FULL OUTER JOIN ou FULL JOIN

 

O LEFT JOIN retorna todas as linhas da tabela à esquerda (Tabela 1), com as linhas correspondentes na tabela direita (tabela2). O resultado é NULL no lado direito, quando não há equivalência no critério de junção.

Sintaxe:


 SELECT nome_coluna(s)
 FROM tabela1
 RIGHT JOIN tabela2
 ON tabela1.nome_coluna =tabela2.nome_coluna;
 


 SELECT nome_coluna(s)
 FROM tabela1
 RIGHT OUTER JOIN tabela2
 ON tabela1.nome_coluna =tabela2.nome_coluna;

 

 

A seguir temos um exemplo usando LEFT OUTER JOIN onde estamos incluindo todos os pedidos desconsiderando se existe ou  não um cliente relacionado a ele.

 

 SELECT Clientes.CustomerID, Clientes.ContactName,Clientes.City,
         Pedidos
.OrderID, Pedidos.OrderDate
 FROM
Customers As Clientes
 
LEFT OUTER JOIN Orders as Pedidos
 
ON Clientes.CustomerID = Pedidos.CustomerID

 

 

Usando LEFT OUTER JOIN incluímos todas as linhas da tabela Customers no resultado, mesmo se não existir uma equivalência na coluna CustomerID na tabela Orders.

 

Quando não existir um pedido relacionado pela coluna CustomerID as linhas vão conter um valor NULL para a coluna OrderID.

 

 3 - Retornando linhas relacionadas entre tabelas - RIGHT OUTER JOIN

 

O RIGHT JOIN retorna todas as linhas da tabela à direita (tabela2), com as linhas correspondentes na tabela à esquerda (Tabela 1). O resultado é NULL no lado esquerdo, quando não há correspondência no critério de junção.

 

Sintaxe:


 SELECT nome_coluna(s)
 FROM tabela1
 RIGHT JOIN tabela2
 ON tabela1.nome_coluna =tabela2.nome_coluna;
 


 SELECT nome_coluna(s)
 FROM tabela1
 RIGHT OUTER JOIN tabela2
 ON tabela1.nome_coluna =tabela2.nome_coluna;

 

 

No exemplo a seguir estamos retornando todos os empregados e quaisquer pedidos que eles tenham feito:

 

use Northwind

SELECT Orders.OrderID, Orders.CustomerID, Employees.FirstName, Employees.City
FROM
Orders
RIGHT
JOIN Employees
ON
Orders.EmployeeID=Employees.EmployeeID
ORDER
BY Orders.OrderID
;

 
 

 

RIGHT JOIN retorna todas as linhas da tabela Employees mesmo que não existam equivalência  no critério de junção na tabela Orders.

 4-Retornando linhas relacionadas entre tabelas - FULL OUTER JOIN

Para reter informações não correspondentes mediante a inclusão de linhas não correspondentes nos resultados de uma junção, use uma junção externa completa. O SQL Server fornece um operador de junção externa completa, FULL OUTER JOIN, que inclui todas as linhas de ambas as tabelas, independentemente de a outra tabela ter ou não um valor correspondente.

FULL OUTER JOIN retorna todas as linhas da tabela da esquerda (Tabela 1) e da tabela da direita (Tabela 2). Assim ele combina o resultado de LEFT e RIGHT JOIN.

Sintaxe:


 SELECT nome_coluna(s)
 FROM tabela1
 FULL OUTER JOIN tabela2
 ON tabela1.nome_coluna =tabela2.nome_coluna;
 


Exemplo:

use Northwind

SELECT Customers.CustomerID, Customers.ContactName, Orders.OrderID
FROM
Customers
FULL
OUTER JOIN Orders
ON
Customers.CustomerID=Orders.CustomerID

 

 

Se houver linhas na tabela "Customers" sem correspondente na tabela "Orders", ou se vice-versa, essas linhas também serão listados.

 

É possível incluir uma cláusula WHERE com uma junção externa completa para retornar apenas as linhas em que não há dados correspondentes entre as tabela

 

Aguarde outro artigo sobre o assunto em breve.

Rom 7:4 Assim também vós, meus irmãos, fostes mortos quanto à lei mediante o corpo de Cristo, para pertencerdes a outro, àquele que ressurgiu dentre os mortos a fim de que demos fruto para Deus.

Rom 7:5 Pois, quando estávamos na carne, as paixões dos pecados, suscitadas pela lei, operavam em nossos membros para darem fruto para a morte.

Rom 7:6 Mas agora fomos libertos da lei, havendo morrido para aquilo em que estávamos retidos, para servirmos em novidade de espírito, e não na velhice da letra.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti