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