Ambas as junções internas e externas são usadas para combinar dados de duas ou mais tabelas; no entanto, existem algumas diferenças importantes! Leia este artigo para descobrir os pontos fortes de cada comando e quando usá-los.
Para obter o máximo desta e de nossas outras lições, certifique-se de praticar usando os exemplos!
Todos os os exemplos desta lição são baseados no Microsoft SQL Server Management Studio e no banco de dados AdventureWorks2012. Comece a usar essas ferramentas gratuitas usando meu Guia de primeiros passos com o SQL Server.
Qual é a diferença entre junções internas e junções externas?
As junções internas e externas são combinações de linhas de dois ou mais tabelas em um único resultado usando uma condição de junção. A condição de junção especifica como as colunas de cada tabela correspondem umas às outras. Na maioria dos casos, o objetivo é encontrar valores iguais entre as tabelas e incluir essas correspondências.
O caso mais comum para isso é quando você está combinando a chave estrangeira de uma tabela com a chave primária de outra , como ao usar e ID para pesquisar um valor.
Embora as junções internas e externas incluam linhas de ambas as tabelas quando a condição de correspondência for bem-sucedida, elas diferem na maneira como tratam uma condição de correspondência falsa.
As junções internas não incluem linhas não correspondentes; enquanto as junções externas as incluem.
Vamos nos aprofundar um pouco mais na mecânica de cada
Mecânica da junção interna
Uma junção interna é usada para retornar resultados combinando linhas de duas ou mais tabelas.
Em seu caso mais simples, onde não há condição de junção, uma junção interna combinaria todas as linhas de uma tabela com as de outra. Se a primeira tabela contiver três linhas e a segunda quatro, o resultado final conterá doze (3 x 4 = 12)!
O propósito da condição de junção é limitar quais linhas são combinadas. Na maioria dos casos, limitamos as linhas àquelas que correspondem a uma coluna.
Se uma pessoa tiver mais de um número de telefone, mais de uma correspondência será feita. A partir disso, você pode ver que podemos obter mais linhas retornadas do que para cada pessoa.
Inversamente, se uma pessoa não tiver número de telefone, não haverá uma entrada no PersonPhone e nenhuma correspondência será feita. Essa pessoa em particular não será incluída nos resultados, pois apenas aqueles com correspondências são incluídos.
Vamos tentar um exemplo.
Exemplo de junção interna
Suponha o gerente de RH deseja criar uma lista telefônica. Eles querem o nome, sobrenome, cargo e números de telefone da pessoa. Que consulta você poderia usar para criar isso?
Aqui está uma que resolveria o problema:
SELECT P.FirstName, P.LastName, P.Title, PH.PhoneNumberFROM Person.Person AS P INNER JOIN Person.PersonPhone AS PH ON P.BusinessEntityID = PH.BusinessEntityID AND PH.PhoneNumberTypeID = 3ORDER BY P.LastName
O INNER JOIN especifica quais tabelas para entrar e a condição de correspondência para fazê-lo. A condição PH.Phone NumberTyeID = 3 limita a consulta aos números comerciais.
Se você executar o procedimento acima, obterá os seguintes resultados:
Tenha em mente que a junção interna retorna apenas a linha onde a condição de correspondência é verdade. Neste exemplo, as linhas em que os BusinessEntityIDs não correspondem não são incluídas. Isso pode ser um problema se uma pessoa não tiver um número de telefone, pois esses funcionários não estariam na lista.
Se desejar incluir esses funcionários, você pode usar uma associação externa.
Mecânica de junção externa
Uma junção externa é usada para retornar resultados combinando linhas de duas ou mais tabelas. Mas, ao contrário de uma junção interna, a junção externa retornará todas as linhas de uma tabela especificada, mesmo se a condição de junção falhar.
Veja o exemplo da lista telefônica acima. Se o gerente de RH quisesse listar todos os funcionários, independentemente de eles terem um número de telefone comercial, o uso de uma junção externa tornaria isso possível.
SELECT P.FirstName, P.LastName, P.Title, PH.PhoneNumberFROM Person.Person AS P LEFT OUTER JOIN Person.PersonPhone AS PH ON P.BusinessEntityID = PH.BusinessEntityID AND PH.PhoneNumberTypeID = 3ORDER BY P.LastName
Você pode aprenda mais sobre junções externas esquerda e direita neste artigo, por agora apenas entenda que quando um LEFT OUTER JOIN é usado, todas as linhas da tabela na cláusula FROM são incluídas no resultado, mesmo se uma correspondência não for encontrada com o outra tabela.
Quando uma correspondência não é encontrada, um NULL é colocado na coluna.
Você pode ver isso em ação abaixo:
Observe no exemplo que PhoneNumber para Catherine Abel é NULL. Isso ocorre porque o número de trabalho de Catherine não está listado e nenhuma correspondência foi encontrada durante a junção.
Se esta fosse uma junção interna, esta linha não teria sido incluída nos resultados.