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:
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.
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.
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; |
|
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.00O 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 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 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.CityFROM 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:
|
|
Exemplo:
use
Northwind SELECT Customers.CustomerID, Customers.ContactName, Orders.OrderIDFROM 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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
http://technet.microsoft.com/en-us/library/ms190014%28v=sql.105%29.aspx