inner join vs outer join
Junção interna vs. junção externa: prepare-se para explorar as diferenças exatas entre junção interna e externa
Antes de explorar as diferenças entre Inner Join e Outer Join, vamos primeiro ver o que é SQL JOIN?
Uma cláusula de junção é usada para combinar registros ou para manipular os registros de duas ou mais tabelas por meio de uma condição de junção. A condição de junção indica como as colunas de cada tabela são comparadas entre si.
A junção é baseada em uma coluna relacionada entre essas tabelas. Um exemplo mais comum é a junção entre duas tabelas por meio da coluna de chave primária e coluna de chave estrangeira.
Suponha que temos uma tabela que contém o salário do funcionário e há outra tabela que contém os detalhes do funcionário.
Nesse caso, haverá uma coluna comum como ID do funcionário que unirá essas duas tabelas. Essa coluna de ID do funcionário seria a chave primária das tabelas de detalhes do funcionário e a chave estrangeira na tabela de salários do funcionário.
É muito importante ter uma chave comum entre as duas entidades. Você pode pensar em uma tabela como uma entidade e a chave como um elo comum entre as duas tabelas que é usado para a operação de junção.
modelo de assinatura de teste de aceitação do usuário
Basicamente, existem dois tipos de junção no SQL, ou seja, Junção interna e junção externa . A junção externa é subdividida em três tipos, ou seja, Junção externa esquerda, Junção externa direita e Junção externa completa.
Neste artigo, veremos a diferença entre Junção interna e junção externa em detalhe. Manteremos as junções cruzadas e as junções desiguais fora do escopo deste artigo.
O que você aprenderá:
- O que é Inner Join?
- O que é Outer Join?
- Diferença entre junção interna e externa
- Desempenho
- Junção interna e externa do MS Access
- Junção à esquerda vs Junção externa à esquerda
- Junção Externa Esquerda vs Junção Externa Direita
- Diferença entre junção interna e junção externa em formato tabular
- União interna e externa contra união
- Conclusão
- Leitura recomendada
O que é Inner Join?
Uma junção interna retorna apenas as linhas que possuem valores correspondentes em ambas as tabelas (estamos considerando aqui que a junção é feita entre as duas tabelas).
O que é Outer Join?
A junção externa inclui as linhas correspondentes, bem como algumas das linhas não correspondentes entre as duas tabelas. Uma junção externa difere basicamente da junção interna em como ela lida com a condição de correspondência falsa.
Existem 3 tipos de junção externa:
- União Externa Esquerda : Retorna todas as linhas da tabela LEFT e registros correspondentes entre as duas tabelas.
- Junção Externa Direita : Retorna todas as linhas da tabela RIGHT e registros correspondentes entre as duas tabelas.
- Full Outer Join : Combina o resultado da Junção Externa Esquerda e Junção Externa Direita.
Diferença entre junção interna e externa
(imagem fonte )
Conforme mostrado no diagrama acima, existem duas entidades, ou seja, a tabela 1 e a tabela 2 e ambas as tabelas compartilham alguns dados comuns.
Uma Inner Join retornará a área comum entre essas tabelas (a área sombreada em verde no diagrama acima), ou seja, todos os registros que são comuns entre a tabela 1 e a tabela 2.
Uma Left Outer Join retornará todas as linhas da tabela 1 e apenas as linhas da tabela 2 que são comuns à tabela 1 também. A Right Outer Join fará exatamente o oposto. Ele fornecerá todos os registros da tabela 2 e apenas os registros correspondentes correspondentes da tabela 1.
Além disso, uma Full Outer Join nos dará todos os registros da tabela 1 e da tabela 2.
Vamos começar com um exemplo para tornar isso mais claro.
Suponha que temos dois mesas: EmpDetails e EmpSalary .
Tabela EmpDetails:
ID do Empregado | Nome do empregado |
7 | Lírio |
1 | John |
dois | Samantha |
3 | Nenhum |
4 | Sedoso |
5 | RAM |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
Tabela EmpSalary:
ID do Empregado | Nome do empregado | EmployeeSalary |
---|---|---|
onze | Rosa | 90000 |
1 | John | 50.000 |
dois | Samantha | 120000 |
3 | Nenhum | 75000 |
4 | Sedoso | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
13 | Jack | 250.000 |
Vamos fazer um Inner Join nessas duas tabelas e observar o resultado:
Consulta:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultado:
ID do Empregado | Nome do empregado | EmployeeSalary |
---|---|---|
7 | Lírio | NULO |
1 | John | 50.000 |
dois | Samantha | 120000 |
3 | Nenhum | 75000 |
4 | Sedoso | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
No conjunto de resultados acima, você pode ver que Inner Join retornou os primeiros 6 registros que estavam presentes em EmpDetails e EmpSalary com uma chave correspondente, ou seja, EmployeeID. Portanto, se A e B são duas entidades, o Inner Join retornará o conjunto de resultados que será igual a ‘Registros em A e B’, com base na chave correspondente.
Vamos agora ver o que um Left Outer Join fará.
Consulta:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultado:
ID do Empregado | Nome do empregado | EmployeeSalary |
---|---|---|
1 | John | 50.000 |
dois | Samantha | 120000 |
3 | Nenhum | 75000 |
4 | Sedoso | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
8 | Sita | NULO |
9 | Farah | NULO |
10 | Jerry | NULO |
No conjunto de resultados acima, você pode ver que a junção externa esquerda retornou todos os 10 registros da tabela LEFT, ou seja, a tabela EmpDetails e como os primeiros 6 registros são correspondentes, ela retornou o salário do funcionário para esses registros correspondentes.
Como o restante dos registros não possui uma chave correspondente na tabela RIGHT, ou seja, a tabela EmpSalary, ela retornou NULL correspondente àquelas. Como Lily, Sita, Farah e Jerry não têm um ID de funcionário correspondente na tabela EmpSalary, seu Salário é exibido como NULL no conjunto de resultados.
Portanto, se A e B são duas entidades, a junção externa esquerda retornará o conjunto de resultados que será igual a ‘Registros em A NÃO B’, com base na chave correspondente.
Agora vamos observar o que o Right Outer Join faz.
Consulta:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultado:
ID do Empregado | Nome do empregado | EmployeeSalary |
---|---|---|
NULO | NULO | 90000 |
1 | John | 50.000 |
dois | Samantha | 120000 |
3 | Nenhum | 75000 |
4 | Sedoso | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
NULO | NULO | 250.000 |
NULO | NULO | 250.000 |
No conjunto de resultados acima, você pode ver que a junção externa direita fez exatamente o oposto da junção esquerda. Ele retornou todos os salários da tabela certa, ou seja, tabela EmpSalary.
Mas, como Rose, Sakshi e Jack não têm um ID de funcionário correspondente na tabela à esquerda, ou seja, a tabela EmpDetails, obtivemos seu ID de funcionário e EmployeeName como NULL na tabela à esquerda.
Portanto, se A e B são duas entidades, a junção externa direita retornará o conjunto de resultados que será igual a ‘Registros em B NÃO A’, com base na chave correspondente.
Vamos ver também qual será o conjunto de resultados se estivermos fazendo uma operação de seleção em todas as colunas em ambas as tabelas.
Consulta:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultado:
ID do Empregado | Nome do empregado | ID do Empregado | Nome do empregado | EmployeeSalary |
---|---|---|---|---|
NULO | NULO | onze | Rosa | 90000 |
1 | John | 1 | John | 50.000 |
dois | Samantha | dois | Samantha | 120000 |
3 | Nenhum | 3 | Nenhum | 75000 |
4 | Sedoso | 4 | Sedoso | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NULO | NULO | 12 | Sakshi | 250.000 |
NULO | NULO | 13 | Jack | 250.000 |
Agora, vamos passar para o Full Join.
Uma junção externa completa é feita quando queremos todos os dados de ambas as tabelas, independentemente de haver uma correspondência ou não. Portanto, se eu quiser todos os funcionários, mesmo que não encontre uma chave correspondente, executarei uma consulta conforme mostrado abaixo.
Consulta:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultado:
ID do Empregado | Nome do empregado | ID do Empregado | Nome do empregado | EmployeeSalary |
---|---|---|---|---|
7 | Lírio | NULO | NULO | NULO |
1 | John | 1 | John | 50.000 |
dois | Samantha | dois | Samantha | 120000 |
3 | Nenhum | 3 | Nenhum | 75000 |
4 | Sedoso | 4 | Sedoso | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NULO | NULO | NULO |
9 | Farah | NULO | NULO | NULO |
10 | Jerry | NULO | NULO | NULO |
NULO | NULO | onze | Rosa | 90000 |
NULO | NULO | 12 | Sakshi | 250.000 |
NULO | NULO | 13 | Jack | 250.000 |
Você pode ver no conjunto de resultados acima que, como os primeiros seis registros são correspondentes em ambas as tabelas, obtemos todos os dados sem nenhum NULL. Os próximos quatro registros existem na tabela da esquerda, mas não na tabela da direita, portanto, os dados correspondentes na tabela da direita são NULL.
Os últimos três registros existem na tabela da direita e não na tabela da esquerda, portanto, temos NULL nos dados correspondentes da tabela da esquerda. Portanto, se A e B são duas entidades, a junção externa completa retornará o conjunto de resultados que será igual a ‘Registros em A AND B’, independentemente da chave correspondente.
Teoricamente, é uma combinação de Junção à Esquerda e Junção à Direita.
Desempenho
Vamos comparar uma junção interna com uma junção externa esquerda no servidor SQL. Falando sobre a velocidade da operação, um JOIN externo esquerdo obviamente não é mais rápido do que um JOIN interno.
De acordo com a definição, uma junção externa, seja à esquerda ou à direita, deve realizar todo o trabalho de uma junção interna junto com o trabalho adicional nulo - estendendo os resultados. Espera-se que uma junção externa retorne um número maior de registros, o que aumenta ainda mais seu tempo de execução total apenas por causa do conjunto de resultados maior.
Portanto, uma junção externa é mais lenta do que uma junção interna.
Além disso, pode haver algumas situações específicas em que a junção à esquerda será mais rápida do que uma junção interna, mas não podemos continuar substituindo-as uma pela outra, pois uma junção externa esquerda não é funcionalmente equivalente a uma junção interna.
estrutura de dados da fila c ++
Vamos discutir uma instância em que o Left Join pode ser mais rápido do que o Inner Join. Se as tabelas envolvidas na operação de junção forem muito pequenas, diga que elas têm menos de 10 registros e as tabelas não possuem índices suficientes para cobrir a consulta, nesse caso, a junção à esquerda é geralmente mais rápida do que a junção interna.
Vamos criar as duas tabelas abaixo e fazer um INNER JOIN e um LEFT OUTER JOIN entre eles como exemplo:
CREATE TABLE #Table1 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table1 (ID, Name) VALUES (1, 'A') INSERT #Table1 (ID, Name) VALUES (2, 'B') INSERT #Table1 (ID, Name) VALUES (3, 'C') INSERT #Table1 (ID, Name) VALUES (4, 'D') INSERT #Table1 (ID, Name) VALUES (5, 'E') CREATE TABLE #Table2 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table2 (ID, Name) VALUES (1, 'A') INSERT #Table2 (ID, Name) VALUES (2, 'B') INSERT #Table2 (ID, Name) VALUES (3, 'C') INSERT #Table2 (ID, Name) VALUES (4, 'D') INSERT #Table2 (ID, Name) VALUES (5, 'E') SELECT * FROM #Table1 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
EU IA | Nome | EU IA | Nome | |
---|---|---|---|---|
Abaixo está a visualização de uma junção interna: ![]() | Abaixo está a visualização de uma junção externa ![]() | |||
1 | 1 | PARA | 1 | PARA |
dois | dois | B | dois | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | É | 5 | É |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
EU IA | Nome | EU IA | Nome | |
---|---|---|---|---|
1 | 1 | PARA | 1 | PARA |
dois | dois | B | dois | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | É | 5 | É |
Como você pode ver acima, ambas as consultas retornaram o mesmo conjunto de resultados. Nesse caso, se você visualizar o plano de execução de ambas as consultas, verá que a junção interna custou mais do que a junção externa. Isso ocorre porque, para uma junção interna, o servidor SQL faz uma correspondência de hash enquanto faz loops aninhados para a junção à esquerda.
Uma correspondência de hash normalmente é mais rápida do que os loops aninhados. Mas, neste caso, como o número de linhas é tão pequeno e não há índice para usar (como estamos fazendo junção na coluna de nome), a operação de hash resultou em uma consulta de junção interna mais cara.
No entanto, se você alterar a chave correspondente na consulta de junção de Nome para ID e se houver um grande número de linhas na tabela, você descobrirá que a junção interna será mais rápida do que a junção externa esquerda.
Junção interna e externa do MS Access
Ao usar várias fontes de dados na consulta do MS Access, você aplica JOINs para controlar os registros que deseja ver, dependendo de como as fontes de dados estão vinculadas umas às outras.
Em uma junção interna, apenas os relacionados de ambas as tabelas são combinados em um único conjunto de resultados. Esta é uma associação padrão no Access e também a mais usada. Se você aplicar uma junção, mas não especificar explicitamente o tipo de junção, o Access presumirá que é uma junção interna.
Em junções externas, todos os dados relacionados de ambas as tabelas são combinados corretamente, mais todas as linhas restantes de uma tabela. Em junções externas completas, todos os dados são combinados sempre que possível.
Junção à esquerda vs Junção externa à esquerda
No servidor SQL, a palavra-chave outer é opcional quando você aplica a junção externa esquerda. Assim, não faz qualquer diferença se você escrever ‘LEFT OUTER JOIN’ ou ‘LEFT JOIN’, pois ambos vão dar o mesmo resultado.
A LEFT JOIN B é uma sintaxe equivalente a A LEFT OUTER JOIN B.
Abaixo está a lista de sintaxes equivalentes no servidor SQL:
(imagem fonte )
Junção Externa Esquerda vs Junção Externa Direita
Já vimos essa diferença neste artigo. Você pode consultar as consultas Left Outer Join e Right Outer Join e o conjunto de resultados para ver a diferença.
A principal diferença entre a junção à esquerda e a junção à direita reside na inclusão de linhas não correspondentes. A junção externa esquerda inclui as linhas não correspondidas da tabela que está à esquerda da cláusula de junção, enquanto uma junção externa direita inclui as linhas não correspondidas da tabela que está à direita da cláusula de junção.
As pessoas perguntam o que é melhor usar, por exemplo, junção à esquerda ou junção à direita? Basicamente, eles são o mesmo tipo de operação, exceto com seus argumentos invertidos. Portanto, quando você pergunta qual junção usar, na verdade está perguntando se deve escrever um uma. É apenas uma questão de preferência.
Geralmente, as pessoas preferem usar a junção à esquerda em suas consultas SQL. Eu sugeriria que você deveria manter a consistência na forma como está escrevendo a consulta, a fim de evitar qualquer confusão na interpretação da consulta.
Vimos tudo sobre a junção interna e todos os tipos de junções externas até agora. Vamos resumir rapidamente a diferença entre Inner Join e Outer Join.
Diferença entre junção interna e junção externa em formato tabular
Junção interna | Junção Externa |
---|---|
Retorna apenas as linhas que possuem valores correspondentes em ambas as tabelas. | Inclui as linhas correspondentes, bem como algumas das linhas não correspondentes entre as duas tabelas. |
Caso haja um grande número de linhas nas tabelas e haja um índice a ser usado, INNER JOIN é geralmente mais rápido do que OUTER JOIN. | Geralmente, um OUTER JOIN é mais lento do que um INNER JOIN, pois precisa retornar um número maior de registros quando comparado ao INNER JOIN. No entanto, pode haver alguns cenários específicos em que OUTER JOIN é mais rápido. |
Quando uma correspondência não é encontrada, ele não retorna nada. | Quando uma correspondência não é encontrada, um NULL é colocado no valor da coluna retornado. |
Use INNER JOIN quando quiser consultar informações detalhadas de qualquer coluna específica. | Use OUTER JOIN quando quiser exibir a lista de todas as informações nas duas tabelas. |
INNER JOIN atua como um filtro. Deve haver uma correspondência em ambas as tabelas para que uma junção interna retorne dados. | Eles agem como complementos de dados. |
A notação de junção implícita existe para junção interna, que lista as tabelas a serem unidas de maneira separada por vírgula na cláusula FROM. Exemplo: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | Nenhuma notação de junção implícita existe para junção externa. |
União interna e externa contra união
Às vezes, nós confundimos Join e Union e esta também é uma das perguntas mais comuns em Entrevistas SQL . Já vimos a diferença entre a junção interna e a junção externa. Agora, vamos ver como um JOIN é diferente de um UNION.
UNION coloca uma linha de consultas uma após a outra, enquanto join cria um produto cartesiano e o subconjunto. Portanto, UNION e JOIN são operações completamente diferentes.
Vamos executar as duas consultas a seguir no MySQL e ver seus resultados.
Consulta UNION:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Resultado:
Bah | |
---|---|
1 | 28 |
dois | 35 |
Consulta JOIN:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Resultado:
foo | Barra | |
---|---|---|
1 | 38 | 35 |
Uma operação UNION coloca o resultado de duas ou mais consultas em um único conjunto de resultados. Este conjunto de resultados contém todos os registros que são retornados por meio de todas as consultas envolvidas na UNION. Assim, basicamente, um UNION está combinando os dois conjuntos de resultados.
Uma operação de junção busca dados de duas ou mais tabelas com base nas relações lógicas entre essas tabelas, ou seja, com base na condição de junção. Na consulta de junção, os dados de uma tabela são usados para selecionar registros de outra tabela. Ele permite vincular dados semelhantes que estão presentes em tabelas diferentes.
Para entendê-lo de forma muito simples, você pode dizer que um UNION combina linhas de duas tabelas, enquanto uma junção combina colunas de duas ou mais tabelas. Assim, ambos são usados para combinar os dados de n tabelas, mas a diferença está em como os dados são combinados.
Abaixo estão as representações pictóricas de UNION e JOIN.
O acima é uma representação pictórica de uma operação de junção mostrando que cada registro no conjunto de resultados contém colunas de ambas as tabelas, ou seja, Tabela A e Tabela B. Este resultado é retornado com base na condição de junção aplicada na consulta.
Uma junção geralmente é o resultado da desnormalização (oposto à normalização) e usa a chave estrangeira de uma tabela para pesquisar os valores da coluna, empregando a chave primária em outra tabela.
O texto acima é uma representação pictórica de uma Operação UNION, mostrando que cada registro no conjunto de resultados é uma linha de uma das duas tabelas. Assim, o resultado da UNION combinou as linhas da Tabela A e da Tabela B.
Leitura adicional = >> MySQL UNION explicado com exemplos
Conclusão
Neste artigo, vimos as principais diferenças entre os Inner Join e Outer Join em SQL . Também vimos a classificação de uma junção externa, ou seja, junção à esquerda, junção à direita e junção completa. Vimos como cada um desses tipos de junção funciona e como eles variam entre si.
Também fizemos algumas comparações de desempenho entre esses tipos de junção. Também discutimos como uma associação é diferente de um sindicato.
Leia também = >> Tipos de junção do MySQL
Espero que este artigo tenha ajudado a esclarecer suas dúvidas em relação às diferenças entre os vários tipos de junção. Temos certeza de que isso realmente fará com que você decida qual tipo de junção escolher com base no conjunto de resultados desejado.
Leitura recomendada
- Diferença exata entre verificação e validação com exemplos
- Modem Vs Roteador: Conheça a Diferença Exata
- Diferença entre SQL Vs MySQL Vs SQL Server (com exemplos)
- Tutorial Python DateTime com exemplos
- LAN Vs WAN Vs MAN: diferença exata entre os tipos de rede
- Cortar comando no Unix com exemplos
- Sintaxe de comando Unix Cat, opções com exemplos
- Uso do cursor no MongoDB com exemplos