Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Uma visão geral dos tipos de junção SQL com exemplos




SQL JOIN é uma cláusula usada para combinar várias tabelas e recuperar dados com base em um campo comum em bancos de dados relacionais. Os profissionais de banco de dados usam normalizações para garantir e melhorar a integridade dos dados. Nas várias formas de normalização, os dados são distribuídos em várias tabelas lógicas. Essas tabelas usam restrições referenciais – chave primária e chaves estrangeiras – para impor a integridade dos dados nas tabelas do SQL Server. Na imagem abaixo, temos um vislumbre do processo de normalização do banco de dados.


Compreendendo os diferentes tipos de SQL JOIN


SQL JOIN gera dados significativos combinando várias tabelas relacionais. Essas tabelas são relacionadas usando uma chave e têm relacionamentos de um para um ou de um para muitos. Para recuperar os dados corretos, você deve conhecer os requisitos de dados e os mecanismos de junção corretos. O SQL Server oferece suporte a várias associações e cada método tem uma maneira específica de recuperar dados de várias tabelas. A imagem abaixo especifica as associações do SQL Server com suporte.


Junto interno SQL


A junção interna SQL inclui linhas das tabelas em que as condições de junção são satisfeitas. Por exemplo, no diagrama de Venn abaixo, a junção interna retorna as linhas correspondentes da Tabela A e da Tabela B.

No exemplo abaixo, observe as seguintes coisas:
  • Temos duas tabelas – [Funcionários] e [Endereço].
  • A consulta SQL é unida nas colunas [Employees].[EmpID] e [Address].[ID].

A saída da consulta retorna os registros de funcionários para EmpID que existem em ambas as tabelas.



A junção interna retorna linhas correspondentes de ambas as tabelas; portanto, também é conhecido como Equi join. Se não especificarmos a palavra-chave interna, o SQL Server realizará a operação de junção interna.



Em outro tipo de junção interna, uma junção teta, não usamos o operador de igualdade (=) na cláusula ON. Em vez disso, usamos operadores de não igualdade, como .

SELECT * FROM Table1 T1, Table2 T2 WHERE T1.Preço

Auto-junção SQL


Em uma associação automática, o SQL Server une a tabela consigo mesmo. Isso significa que o nome da tabela aparece duas vezes na cláusula from.



Abaixo, temos uma tabela [Emp] que possui os dados dos funcionários e de seus gestores. A autojunção é útil para consultar dados hierárquicos. Por exemplo, na tabela de funcionários, podemos usar o self-join para saber o nome de cada funcionário e de seu gerente subordinado.



A consulta acima coloca uma auto-junção na tabela [Emp]. Ele une a coluna EmpMgrID com a coluna EmpID e retorna as linhas correspondentes.

Junta cruzada SQL


Na junção cruzada, o SQL Server retorna um produto cartesiano de ambas as tabelas. Por exemplo, na imagem abaixo, realizamos uma junção cruzada para as tabelas A e B.



A junção cruzada une cada linha da tabela A a todas as linhas disponíveis na tabela B. Portanto, a saída também é conhecida como produto cartesiano de ambas as tabelas. Na imagem abaixo, observe o seguinte:
  • A tabela [Employee] tem três linhas para Emp ID 1,2 e 3.
  • A tabela [Address] tem registros para Emp ID 1,2,7 e 8.

Na saída de junção cruzada, a linha 1 da tabela [Employee] se une a todas as linhas da tabela [Address] e segue o mesmo padrão para as linhas restantes.



Se a primeira tabela tiver x número de linhas e a segunda tabela tiver n número de linhas, a junção cruzada fornecerá x*n número de linhas na saída. Você deve evitar a junção cruzada em tabelas maiores porque ela pode retornar um grande número de registros e o SQL Server requer muito poder de computação (CPU, memória e E/S) para lidar com dados tão extensos.

Junto externo SQL


Como explicamos anteriormente, a junção interna retorna as linhas correspondentes de ambas as tabelas. Ao usar uma junção externa SQL, ela não apenas lista as linhas correspondentes, mas também retorna as linhas não correspondentes de outras tabelas. A linha sem correspondência depende das palavras-chave esquerda, direita ou completas.

A imagem abaixo descreve em alto nível a junção externa esquerda, direita e completa.


Junta externa esquerda


A junção externa esquerda SQL retorna as linhas correspondentes de ambas as tabelas junto com as linhas não correspondentes da tabela esquerda. Se um registro da tabela esquerda não tiver nenhuma linha correspondente na tabela direita, ele exibirá o registro com valores NULL.

No exemplo abaixo, a junção externa esquerda retorna as seguintes linhas:
  • Linhas correspondentes:os IDs Emp 1 e 2 existem nas tabelas à esquerda e à direita.
  • Linha sem correspondência:o ID do Emp 3 não existe na tabela correta. Portanto, temos um valor NULL na saída da consulta.


Junto externo direito


A junção externa à direita do SQL retorna as linhas correspondentes de ambas as tabelas junto com as linhas não correspondentes da tabela à direita. Se um registro da tabela direita não tiver nenhuma linha correspondente na tabela esquerda, ele exibirá o registro com valores NULL.

No exemplo abaixo, temos as seguintes linhas de saída:
  • Linhas correspondentes:Emp ID 1 e 2 existem em ambas as tabelas; portanto, essas linhas são linhas correspondentes.
  • Linhas sem correspondência:na tabela à direita, temos linhas adicionais para Emp ID 7 e 8, mas essas linhas não estão disponíveis na tabela à esquerda. Portanto, obtemos o valor NULL na junção externa direita para essas linhas.


União externa completa


Uma junção externa completa retorna as seguintes linhas na saída:
  • Correspondência de linhas entre duas tabelas.
  • Linhas sem correspondência semelhantes à junção externa esquerda:valores NULL para linhas sem correspondência da tabela à direita.
  • Linhas sem correspondência semelhantes à junção externa direita:valores nulos para linhas sem correspondência da tabela à esquerda.


O SQL une-se a várias tabelas


Nos exemplos anteriores, usamos duas tabelas em uma consulta SQL para realizar operações de junção. Principalmente, juntamos várias tabelas e ele retorna os dados relevantes.

A consulta abaixo usa várias junções internas.
USE [AdventureWorks2019]
GO
SELECT 
e.[BusinessEntityID] 
,p.[FirstName] 
,p.[MiddleName] 
,p.[LastName] 
,e.[JobTitle]
,d.[Name] AS [Department] 
,d.[GroupName] 
,edh.[StartDate] 
FROM [HumanResources].[Employee] e
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh 
ON e.[BusinessEntityID] = edh.[BusinessEntityID] 
INNER JOIN [HumanResources].[Department] d 
ON edh.[DepartmentID] = d.[DepartmentID] 
WHERE edh.EndDate IS NULL
GO

Vamos analisar a consulta nas seguintes etapas:
  • Resultado intermediário 1:  A primeira junção interna é entre a tabela [HumanResources].[Employees] e [Person].[Person].
  • Resultado intermediário 2:  Junção interna entre a tabela [Resultado intermediário 1] e [HumanResources].[EmployeeDepartmentHistory].
  • Resultado intermediário 3:  Junção interna entre a tabela [Resultado intermediário 2] e [Recursos humanos].[Departamento].



Depois de executar a consulta com várias junções, o otimizador de consultas prepara o plano de execução. Ele prepara um plano de execução com custo otimizado que satisfaz as condições de junção com o uso de recursos - por exemplo, no plano de execução real abaixo, podemos observar vários loops aninhados (junção interna) e correspondência de hash (junção interna) combinando dados de várias tabelas de junção .


Valores NULL e junções SQL


Suponha que tenhamos valores NULL nas colunas da tabela e juntemos as tabelas nessas colunas. O SQL Server corresponde a valores NULL?

Os valores NULL não correspondem uns aos outros. Portanto, o SQL Server não pôde retornar a linha correspondente. No exemplo abaixo, temos NULL na coluna EmpID da tabela [Employees]. Portanto, na saída, ele retorna a linha correspondente apenas para [EmpID] 2.



Podemos obter essa linha NULL na saída no caso de uma junção externa SQL porque ela também retorna as linhas não correspondidas.


Práticas recomendadas da associação SQL


Neste artigo, exploramos os diferentes tipos de junção SQL. Aqui estão algumas práticas recomendadas importantes a serem lembradas e aplicadas ao usar junções SQL.
  • As junções internas geram as linhas correspondentes da condição de junção em ambas as tabelas.
  • A junção cruzada retorna o produto cartesiano de ambas as tabelas.
  • A junção externa retorna as linhas correspondentes e não correspondentes, dependendo das palavras-chave esquerda, direita e completas.
  • A autojunção SQL une uma tabela a ela mesma.
  • Você deve sempre usar um alias de tabela ao usar as junções nas consultas.
  • Sempre use o formato de nome de duas partes [alias da tabela].[coluna] para colunas nas consultas.
  • No caso de várias junções SQL em uma consulta, você deve usar as ordens lógicas das tabelas de forma a satisfazer sua necessidade de dados e minimizar o fluxo de dados entre vários operadores do plano de execução.
  • Você pode combinar várias junções como junção interna, junção externa e junção automática. No entanto, você deve usar as junções e seus pedidos para obter os dados necessários.