Tecnologias e Linguagens
Tecnologias e Linguagens
para Banco de Dados II
para Banco de Dados II
Aula 6
Aula 6
4329: Relacionando dados de multiplas tabelas
4329: Relacionando dados de multiplas tabelas
Pesquisando multiplas tabelas com joins
Pesquisando multiplas tabelas com joins
Pesquisando multiplas
Pesquisando multiplas
tabelas com joins
tabelas com joins
INNER JOIN
INNER JOIN
OUTER JOIN
OUTER JOIN
CROSS JOIN (Produto Cartesiano)
CROSS JOIN (Produto Cartesiano)
UNION
UNION
INNER JOIN
4
4
INNER JOIN
INNER JOIN
Usa um operador de comparação para relacionar os
Usa um operador de comparação para relacionar os
dados de duas tabelas
dados de duas tabelas
Pode ser definido na clausula FROM ou na clausula
Pode ser definido na clausula FROM ou na clausula
WHERE
WHERE
Porém evite relacionar tabelas através da clausula WHEREPorém evite relacionar tabelas através da clausula WHERE
Valores NULL não podem ser comparados
Valores NULL não podem ser comparados
Sintaxe:
Sintaxe:
FROM <tabela_a> [AS a] INNER JOIN <tabela_b> [AS b] FROM <tabela_a> [AS a] INNER JOIN <tabela_b> [AS b]
ON <tabela_a>.<campo1> = <tabela_b>.<campo1>
ON <tabela_a>.<campo1> = <tabela_b>.<campo1>
5
5
Exemplo1: INNER JOIN
Exemplo1: INNER JOIN
USE AdventureWorks;
USE AdventureWorks;
GO
GO
SELECT e.EmployeeID, e.ManagerID,
SELECT e.EmployeeID, e.ManagerID,
c.FirstName + ' ' + UPPER(c.LastName) AS
c.FirstName + ' ' + UPPER(c.LastName) AS
Name, e.Title
Name, e.Title
FROM HumanResources.Employee AS e
FROM HumanResources.Employee AS e
INNER JOIN Person.Contact AS c ON
INNER JOIN Person.Contact AS c ON
e.ContactID = c.ContactID;
e.ContactID = c.ContactID;
GO
GO
Exemplo2: INNER JOIN
Exemplo2: INNER JOIN
USE AdventureWorks;
USE AdventureWorks;
GO
GO
SELECT s.Name AS StoreName, so.SalesOrderNumber,
SELECT s.Name AS StoreName, so.SalesOrderNumber,
so.OrderDate, so.TotalDue
so.OrderDate, so.TotalDue
FROM Sales.Store AS s
FROM Sales.Store AS s
INNER JOIN Sales.SalesOrderHeader AS so ON
INNER JOIN Sales.SalesOrderHeader AS so ON
s.CustomerID = so.CustomerID
s.CustomerID = so.CustomerID
ORDER BY s.Name, so.OrderDate;
ORDER BY s.Name, so.OrderDate;
GO
7 7
Relacionando Multiplas
Relacionando Multiplas
Tabelas
Tabelas
USE AdventureWorks; USE AdventureWorks; GO GOSELECT p.Name 'Descição do Produto', v.Name AS 'Fornecedor'
SELECT p.Name 'Descição do Produto', v.Name AS 'Fornecedor'
FROM Production.Product AS p JOIN Purchasing.ProductVendor
FROM Production.Product AS p JOIN Purchasing.ProductVendor
AS pv AS pv ON p.ProductID = pv.ProductID ON p.ProductID = pv.ProductID JOIN Purchasing.Vendor AS v JOIN Purchasing.Vendor AS v ON pv.VendorID = v.VendorID ON pv.VendorID = v.VendorID WHERE ProductSubcategoryID = 15; WHERE ProductSubcategoryID = 15; GO GO 8 8
OUTER JOIN
OUTER JOIN
Retorna todos os registros de (ao menos) uma das tabelas Retorna todos os registros de (ao menos) uma das tabelas relacionadas
relacionadas
LEFT OUTER JOINLEFT OUTER JOIN
Seleciona TODOS os registros da tabela a ESQUERDA e preenche comSeleciona TODOS os registros da tabela a ESQUERDA e preenche com NULL os campos da tabela a direita não relacionados
NULL os campos da tabela a direita não relacionados
RIGHT OUTER JOINRIGHT OUTER JOIN
Seleciona TODOS os registros da tabela a DIREITA e preenche com Seleciona TODOS os registros da tabela a DIREITA e preenche com NULL os campos da tabela a ESQUERDA não relacionados
NULL os campos da tabela a ESQUERDA não relacionados
FULL OUTER JOINFULL OUTER JOIN
Seleciona TODOS os registros de TODAS AS TABELAS e preenche Seleciona TODOS os registros de TODAS AS TABELAS e preenche com NULL os campos das tabelas que não se relacionam
com NULL os campos das tabelas que não se relacionam
LEFT OUTER JOIN
LEFT OUTER JOIN
Sales.SalesPerson
Sales.SalesPerson Sales.SalesTerritorySales.SalesTerritory
Production.Product
10
10
LEFT OUTER JOIN
LEFT OUTER JOIN
Exemplo1
Exemplo1
USE AdventureWorks;
USE AdventureWorks;
GO
GO
SELECT st.Name AS Territory, sp.SalesPersonID
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesPerson AS sp
FROM Sales.SalesPerson AS sp
LEFT OUTER JOIN Sales.SalesTerritory AS st
LEFT OUTER JOIN Sales.SalesTerritory AS st
ON st.TerritoryID = sp.TerritoryID;
ON st.TerritoryID = sp.TerritoryID;
GO
GO
11 11LEFT OUTER JOIN
LEFT OUTER JOIN
Exemplo2
Exemplo2
USE AdventureWorks;
USE AdventureWorks;
GO
GO
SELECT p.Name, pr.ProductReviewID
SELECT p.Name, pr.ProductReviewID
FROM Production.Product AS p
FROM Production.Product AS p
LEFT OUTER JOIN Production.ProductReview AS pr
LEFT OUTER JOIN Production.ProductReview AS pr
ON p.ProductID = pr.ProductID
ON p.ProductID = pr.ProductID
ORDER BY pr.ProductReviewID DESC;
ORDER BY pr.ProductReviewID DESC;
GO
GO
RIGHT OUTER JOIN
RIGHT OUTER JOIN
Sales.SalesPerson
Sales.SalesPerson
Sales.SalesTerritory
13
13
RIGHT OUTER JOIN
RIGHT OUTER JOIN
Exemplo
Exemplo
USE AdventureWorks;
USE AdventureWorks;
GO
GO
SELECT st.Name AS Territory, sp.SalesPersonID
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory AS st
FROM Sales.SalesTerritory AS st
RIGHT OUTER JOIN Sales.SalesPerson AS sp
RIGHT OUTER JOIN Sales.SalesPerson AS sp
ON st.TerritoryID = sp.TerritoryID;
ON st.TerritoryID = sp.TerritoryID;
GO
GO
14 14FULL OUTER JOIN
FULL OUTER JOIN
Sales.SalesPerson
Sales.SalesPerson
Sales.SalesTerritory
Sales.SalesTerritory
FULL OUTER JOIN
FULL OUTER JOIN
Exemplo
Exemplo
USE AdventureWorks;
USE AdventureWorks;
GO
GO
SELECT p.Name, sod.SalesOrderID
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
FROM Production.Product p
FULL OUTER JOIN Sales.SalesOrderDetail
FULL OUTER JOIN Sales.SalesOrderDetail
sod
sod
ON p.ProductID = sod.ProductID;
ON p.ProductID = sod.ProductID;
GO
GO
16 16
CROSS JOIN
CROSS JOIN
17 17CROSS JOIN
CROSS JOIN
Gera registros que contém:
Gera registros que contém:
Cada registro da tabela a esquerda combinado comCada registro da tabela a esquerda combinado com
Cada registro da tabela a direitaCada registro da tabela a direita
Produto Cartesiano
Produto Cartesiano
Por ser um resultado normalmente muito grande de
Por ser um resultado normalmente muito grande de
registros retornados o SQL Server
registros retornados o SQL Server
Cria um arquivo temporário em TempDBCria um arquivo temporário em TempDB
Perde performancePerde performance
Pode ser possível combinar campos e gerar um
Pode ser possível combinar campos e gerar um
resultado único (Massa de dados de teste e exemplo)
resultado único (Massa de dados de teste e exemplo)
CROSS JOIN
CROSS JOIN
Exemplo
Exemplo
USE AdventureWorks;
USE AdventureWorks;
GO
GO
SELECT e.EmployeeID, d.Name AS Department
SELECT e.EmployeeID, d.Name AS Department
FROM HumanResources.Employee AS e
FROM HumanResources.Employee AS e
CROSS JOIN HumanResources.Department AS d
CROSS JOIN HumanResources.Department AS d
ORDER BY e.EmployeeID, d.Name;
ORDER BY e.EmployeeID, d.Name;
GO
19 19
UNION
UNION
Sintaxe:
Sintaxe:
declaracao_select UNION [ALL] declaracao_select
declaracao_select UNION [ALL] declaracao_select
Existe um DISTINCT implícito na declaração
Existe um DISTINCT implícito na declaração
Colunas da primeira declaração select devem ser
Colunas da primeira declaração select devem ser
iguais às da segunda declaração select
iguais às da segunda declaração select
ALL
ALL
Permite retornar todas as linhas da segunda
Permite retornar todas as linhas da segunda
consulta, o que melhora a performance da consulta
consulta, o que melhora a performance da consulta
20
20
UNION
UNION
Declarações select serão avaliadas da esquerda para a
Declarações select serão avaliadas da esquerda para a
direita, parênteses redefinem a ordem
direita, parênteses redefinem a ordem
Conversão de dados implícita garante o sucesso da
Conversão de dados implícita garante o sucesso da
consulta
consulta
Regras de uso do UNION:
Regras de uso do UNION:
Mesmo número de colunas com tipos de dados compatíveisMesmo número de colunas com tipos de dados compatíveis
ORDER BY ou COMPUTE são clausulas aplicadas após a ORDER BY ou COMPUTE são clausulas aplicadas após a
ultima declaração UNION no resultado final
ultima declaração UNION no resultado final
GROUP BY e HAVING devem ser aplicados a cada GROUP BY e HAVING devem ser aplicados a cada
declaração select declaração select
Exemplo1: UNION
Exemplo1: UNION
USE AdventureWorks; USE AdventureWorks; GO GO SELECT EmployeeID AS ID SELECT EmployeeID AS ID FROM HumanResources.Employee FROM HumanResources.Employee UNION UNION SELECT DepartmentID SELECT DepartmentID FROM HumanResources.Department FROM HumanResources.Department ORDER BY EmployeeID; ORDER BY EmployeeID; GO GOAdicione o comando ALL ao lado de UNION e observe o resultadoAdicione o comando ALL ao lado de UNION e observe o resultado
Execute a primeira declaração select (comente as linhas de 6 a 8Execute a primeira declaração select (comente as linhas de 6 a 8))
22 22
Exemplo2: UNION
Exemplo2: UNION
USE AdventureWorks; USE AdventureWorks; GO GOSELECT EmployeeID AS ID, Title AS Name
SELECT EmployeeID AS ID, Title AS Name
FROM HumanResources.Employee
FROM HumanResources.Employee
UNION
UNION
SELECT AddressID, AddressLine1
SELECT AddressID, AddressLine1
FROM Person.Address
FROM Person.Address
UNION
UNION
SELECT ContactID, FirstName
SELECT ContactID, FirstName
FROM Person.Contact
FROM Person.Contact
UNION
UNION
SELECT ContactTypeID, Name
SELECT ContactTypeID, Name
FROM Person.ContactType
FROM Person.ContactType
UNION
UNION
SELECT ProductID, Name
SELECT ProductID, Name
FROM Production.Product FROM Production.Product 23 23
Exemplo3: UNION
Exemplo3: UNION
USE AdventureWorks; USE AdventureWorks; GO GOSELECT ProductID, ListPrice AS Price
SELECT ProductID, ListPrice AS Price
FROM Production.Product
FROM Production.Product
UNION ALL
UNION ALL
(SELECT ProductID, UnitPrice
(SELECT ProductID, UnitPrice
FROM Purchasing.PurchaseOrderDetail
FROM Purchasing.PurchaseOrderDetail
UNION
UNION
SELECT ProductID, UnitPrice
SELECT ProductID, UnitPrice
FROM Sales.SalesOrderDetail);
FROM Sales.SalesOrderDetail);
GO
GO
Alterne a posição dos parênteses e do comando ALL para obter Alterne a posição dos parênteses e do comando ALL para obter resultados diferentes.