Juntar-se ao Vs. Juntar-se ao Vs. Juntar-se ao Vs: Diferença exacta com exemplos

Entrar no Vs Entrar no Vs Entrar no Vs Saída: Prepare-se para explorar as diferenças exactas entre Interior e Exterior

Antes de explorar as diferenças entre Interior e Exterior, vamos primeiro ver o que é um SQL JOIN?

Uma cláusula de join é usada para combinar registros ou para manipular os registros de duas ou mais tabelas através de uma condição de join. A condição de join indica como as colunas de cada tabela são combinadas entre si.

Join é baseado numa coluna relacionada entre estas tabelas. Um exemplo mais comum é a união entre duas tabelas através da coluna de chave primária e a coluna de chave estrangeira.

>INNER JOIN VS OUTER JOIN

Suponha, temos uma tabela que contém o Salário do funcionário e há outra tabela que contém detalhes do funcionário.

Neste caso, haverá uma coluna comum como o ID do funcionário que vai unir essas duas tabelas. Esta coluna ID de empregado seria a chave primária das tabelas de detalhes do empregado e chave estrangeira na tabela de salário do empregado.

É muito importante ter uma chave comum entre as duas entidades. Pode-se pensar em uma tabela como uma entidade e a chave como uma ligação comum entre as duas tabelas que é usada para a operação de join.

Basicamente, existem dois tipos de Join in SQL ou seja, Inner Join e Outer Join. O Outer Join é ainda subdividido em três tipos, ou seja, Left Outer Join, Right Outer Join e Full Outer Join.

Neste artigo, veremos em detalhe a diferença entre o Inner Join e o Outer Join. Manteremos as Entradas Cruzadas e Entradas Desiguais fora do escopo deste artigo.

O que é Entrada Interna?

Uma Entrada Interna retorna apenas as linhas que têm valores correspondentes em ambas as tabelas (estamos considerando aqui que a entrada é feita entre as duas tabelas).

O que é Entrada Externa?

A Entrada 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 na forma como lida com a falsa condição de correspondência.

Existem 3 tipos de Junção Externa:

  • Junção Externa Esquerda: Retorna todas as linhas da tabela ESQUERDA e registros de correspondência entre as duas tabelas.
  • Junção Externa Direita: Retorna todas as linhas da tabela DIREITA e registros correspondentes entre as duas tabelas.
  • Junção Externa Completa: Combina o resultado da junção Left Outer Join e Right Outer Join.

Diferença entre Junção Interna e Externa

Diferença entre Junção Interna e Junção Externa

Como mostrado no diagrama acima, existem duas entidades, ou seja, tabela 1 e tabela 2 e ambas as tabelas compartilham alguns dados comuns.

Uma Junção Interna retornará a área comum entre estas tabelas (a área sombreada verde no diagrama acima) ou seja, todos os registros que são comuns entre a tabela 1 e a tabela 2.

Uma Junção Externa Esquerda retornará todas as linhas da tabela 1 e somente as linhas da tabela 2 que são comuns também à tabela 1. Uma Entrada Direita Externa fará exatamente o oposto. Ele nos dará todos os registros da tabela 2 e somente os registros correspondentes da tabela 1.

Outras vezes, uma Entrada Completa Externa nos dará todos os registros da tabela 1 e da tabela 2.

Deixe-nos começar com um exemplo para tornar isto mais claro.

Suponha que temos duas tabelas: EmpDetails e EmpSalary.

EmpDetails Table:

Denominação do empregado Nome do empregado 1 John 2 Samantha
3 Hakuna
4 Silky
5 Ram
6 Arpit
7 Lily
8 Sita
9 Farah
10 Jerry

EmpSalary Table:

EmpSalário Nome do Empregado EmpSalário
1 John 50000 2 Samantha 120000
3 Hakuna 75000
4 Silky 25000 5 Ram 150000
6 Arpit 80000
11 Rose 90000 12 Sakshi 45000
13 Jack 250000

Deixe-nos fazer uma Junção Interior nestas duas tabelas e observe o resultado:

Pergunta:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails INNER JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

Denominação do empregado Nome do empregado Salário do empregado
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000

No conjunto de resultados acima, você pode ver que o Inner Join devolveu os primeiros 6 registros que estavam presentes tanto no EmpDetails quanto no EmpSalary tendo uma chave i correspondente.e. EmployeeID. Assim, 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’, baseado na chave correspondente.

Deixe-nos agora ver o que um Left Outer Join fará.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails LEFT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

ID do empregado Nome do empregado Salário do empregado
1 John 50000 2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
7 Lily NULL
8 Sita NULL
9 Farah NULL
10 Jerry NULL

No conjunto de resultados acima, você pode ver que a união externa esquerda devolveu todos os 10 registros da tabela I à ESQUERDA.e. Tabela EmpDetails e como os primeiros 6 registos são correspondentes, devolveu o salário do empregado para estes registos correspondentes.

Como os restantes registos não têm uma chave correspondente na tabela DIREITA, ou seja, a tabela EmpSalary, devolveu NULL correspondente aos mesmos. Como, Lily, Sita, Farah e Jerry não têm um ID de empregado correspondente na tabela EmpSalary, seu salário está aparecendo como NULL no conjunto de resultados.

Então, se A e B são duas entidades, então a união externa esquerda retornará o conjunto de resultados que será igual a ‘Registros em A NÃO B’, baseado na chave correspondente.

Agora vamos observar o que a união externa direita faz.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails RIGHT join EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

ID do empregado Nome do empregado Salário do empregado
1 John 50000 2 Samantha 120000 3 Hakuna 75000 4 Silky 25000
5 Ram 150000
6 Arpit 80000
NULLL NULLL 90000
NULL NULL 250000
NULLL NULL 250000

No conjunto de resultados acima, você pode ver que o Right Outer Join fez exatamente o oposto do Left Join. Ele retornou todos os salários da tabela da direita, ou seja, EmpSalary table.

But, como Rose, Sakshi, e Jack não têm um ID de empregado correspondente na tabela da esquerda, ou seja, EmpDetails table, nós temos seu ID de empregado e EmployeeName como NULL na tabela da esquerda.

Então, se A e B são duas entidades, então a união externa direita retornará o conjunto de resultados que será igual a ‘Registros em B NÃO A’, baseado na chave correspondente.

Deixe-nos também ver qual será o conjunto de resultados se estivermos fazendo uma operação de seleção em todas as colunas em ambas as tabelas.

Query:

SELECT *FROM EmpDetails RIGHT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

EmployeeID EmployeeName EmployeeID EmployeeName EmployeeSalary
1 John 1 John 50000
2 Samantha 2 Samantha 120000
3 Hakuna 3 Hakuna 75000
4 Silky 4 Silky 25000
5 Ram 5 Ram 150000
6 Arpit 6 Arpit 80000
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000 NULLL NULL 13 Jack 250000

Agora, vamos para o Full Join.

Uma união externa completa é feita quando queremos todos os dados de ambas as tabelas, independentemente de haver ou não uma combinação. Portanto, se eu quiser todos os funcionários mesmo que eu não encontre uma chave correspondente, eu executarei uma consulta como mostrado abaixo.

Query:

SELECT *FROM EmpDetails FULL JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultado:

Denominação do empregado Denominação do empregado Denominação do empregado Denominação do empregado Salário do empregado
1 John 1 John 50000 2 Samantha 2 Samantha 120000 3 Hakuna Hakuna 75000 4 Silky 4 Silky 25000 5 Ram 5 Ram 150000 6 Arpit 6 Arpit 80000 7 Lily NULL NULLL NULLL
8 Sita NULLL NULLL NULLL NULLL
9 Farah NULL NULLL NULLL
10 Jerry NULLL NULLL NULLL NULLL
NULLL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

Pode ver no conjunto de resultados acima que como os primeiros seis registos estão a corresponder em ambas as tabelas, temos todos os dados sem nenhum NULL. Os quatro registos seguintes 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 registos existem na tabela da direita e não na da esquerda, portanto temos NULL nos dados correspondentes na tabela da esquerda. Assim, se A e B são duas entidades, a união externa completa retornará o conjunto de resultados que será igual a ‘Registros em A E B’, independentemente da chave correspondente.

Teóricamente, é uma combinação de união esquerda e união direita.

Desempenho

Deixe-nos comparar uma união interna com uma união externa esquerda no servidor SQL. Falando sobre a velocidade de operação, uma junção externa esquerda não é obviamente mais rápida que uma junção interna.

Como pela definição, uma junção externa, seja ela a esquerda ou a direita, ela tem que realizar todo o trabalho de uma junção interna juntamente com o trabalho adicional nulo – estendendo os resultados. Uma união externa deve retornar um número maior de registros, o que aumenta ainda mais seu tempo total de execução só por causa do maior resultado definido.

Assim, uma união externa é mais lenta que uma união interna.

Mais ainda, pode haver algumas situações específicas em que a junção Left será mais rápida do que uma Inner join, mas não podemos continuar a substituí-las umas pelas outras como uma junção externa esquerda não é funcionalmente equivalente a uma inner join.

Deixe-nos discutir uma instância em que a Left join pode ser mais rápida do que a Inner join. Se as tabelas envolvidas na operação de join são muito pequenas, digamos que têm menos de 10 registros e as tabelas não possuem índices suficientes para cobrir a consulta, nesse caso, o Left Join é geralmente mais rápido que o Inner Join.

Deixe-nos criar as duas tabelas abaixo e fazer um INNER JOIN e um LEFT OUTER JOIN entre elas 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 t1INNER JOIN #Table2 t2ON t2.Name = t1.Name

ID Nome ID ID Nome
1 1 A 1 A
2 2 B 2 2 B
3 C C
4 4 D 4 D
5 5 E 5 E E
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS barON (55=55);
ID Nome ID ID Nome
1 1 A 1 A
2 2 B 2 B
3 3 C 3 C
4 4 D 4 4 D
5 5 E 5 E

Como você pode ver acima, ambas as consultas retornaram o mesmo conjunto de resultados. Neste caso, se você visualizar o plano de execução de ambas as consultas, então você verá que a união interna custou mais que a externa. Isto porque, para um join interno, o servidor SQL faz uma combinação de hash enquanto faz loops aninhados para o join esquerdo.

Uma combinação 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 join na coluna de nomes), a operação de hash tornou-se uma consulta de join interno mais cara.

No entanto, se você alterar a chave de correspondência na consulta de join de Name para ID e se houver um grande número de linhas na tabela, então você vai descobrir que o join interno será mais rápido do que o join externo esquerdo.

Ms Access Inner and Outer Join

Quando utiliza múltiplas fontes de dados na consulta MS Access, então aplica JOINs para controlar os registos que pretende ver, dependendo de como as fontes de dados estão ligadas entre si.

Em uma união interna, apenas as relacionadas de ambas as tabelas são combinadas num único conjunto de resultados. Este é um join padrão no Access e o mais freqüentemente usado também. Se você aplicar um join mas não especificar explicitamente que tipo de join é, então o Access assume que é um join interno.

Em joins externos, todos os dados relacionados de ambas as tabelas são combinados corretamente, mais todas as linhas restantes de uma tabela. Em uniões externas completas, todos os dados são combinados sempre que possível.

Entrada Esquerda vs União Esquerda Externa

No servidor SQL, a palavra-chave externa é opcional quando você aplica união externa esquerda. Assim, não faz qualquer diferença se escrever ‘LEFT OUTER JOIN’ ou ‘LEFT JOIN’ pois ambos lhe vão dar o mesmo resultado.

A LEFT JOIN B é uma sintaxe equivalente a A LEFT OUTER JOIN B.

Below é a lista de sintaxe equivalente no servidor SQL:

Sintaxe equivalente no servidor SQL

Left Outer Join vs Right Outer Join

Já vimos esta diferença neste artigo. Você pode consultar as consultas do Left Outer Join e Right Outer Join e o resultado definido para ver a diferença.

A principal diferença entre o Left Outer Join e o Right Join reside na inclusão de linhas não correspondidas. A junção externa esquerda inclui as linhas não correspondentes da tabela que está à esquerda da cláusula de junção, enquanto uma junção externa direita inclui as linhas não correspondentes da tabela que está à direita da cláusula de junção.

As pessoas perguntam qual é melhor usar, ou seja, junção esquerda ou junção direita? Basicamente, eles são o mesmo tipo de operações, exceto com seus argumentos invertidos. Portanto, quando você pergunta qual join usar, você está realmente perguntando se deve escrever a<b ou b>a. É apenas uma questão de preferência.

Geralmente, as pessoas preferem usar o join à esquerda na sua consulta SQL. Eu sugeriria que você deve permanecer consistente na forma em que está escrevendo a consulta para evitar qualquer confusão na interpretação da consulta.

Vimos tudo sobre Inner join e todos os tipos de Outer join até agora. Vamos resumir rapidamente a diferença entre Interior e Exterior.

>

Diferença entre Interior e Exterior em formato tabular

>

>242424>

Inner Join Outer Join
Retorna apenas as linhas que têm valores correspondentes em ambas as tabelas. Inclui as linhas correspondentes, bem como algumas das linhas não correspondentes entre as duas tabelas.
No caso de haver um grande número de linhas nas tabelas e de haver um índice a utilizar, o INNER JOIN é geralmente mais rápido que o OUTER JOIN. Generalmente, um OUTER JOIN é mais lento que um INNER JOIN, uma vez que necessita de devolver mais registos quando comparado com o INNER JOIN. Entretanto, pode haver alguns cenários específicos onde OUTER JOIN é mais rápido.
Quando um resultado não é encontrado, ele não retorna nada. Quando um resultado não é encontrado, um NULL é colocado no valor da coluna retornada.
Use INNER JOIN quando você quiser procurar informações detalhadas de qualquer coluna específica. Use OUTER JOIN quando você quiser exibir a lista de todas as informações nas duas tabelas.
INNER JOIN age como um filtro. Deve haver uma correspondência em ambas as tabelas para um join interno para retornar dados. Agem como dadosadd ons.
Notação de join implícita existe para o join interno que alista tabelas a serem unidas de forma separada por vírgula na cláusula FROM.
Exemplo: SELECT * FROM product, categoria WHERE product.CategoryID = category.CategoryID;
Notação de união implícita não existe para união externa.
Below é a visualização de uma união interna:
visualização de uma união interna
Below é a visualização de uma união externa
visualização de uma união externa

Inner and Outer Join vs Union

Por vezes, confundimos Join e Union e esta é também uma das perguntas mais comumente feitas em entrevistas SQL. Já vimos a diferença entre join interior e join exterior. Agora, vejamos como um JOIN é diferente de um UNION.

UNION coloca uma linha de consultas uma após a outra, enquanto o join cria um produto cartesiano e o sub-conjunta. Assim, UNION e JOIN são operações completamente diferentes.

Deixe-nos correr as duas consultas abaixo no MySQL e ver o seu resultado.

UNION Query:

SELECT 28 AS bahUNIONSELECT 35 AS bah;

Resultado:

Bah
1 28
2 35

Consulta conjunta:

SELECT * FROM(SELECT 38 AS bah) AS fooJOIN(SELECT 35 AS bah) AS barON (55=55);

Resultado:

>

>

foo Bar
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 através de todas as consultas envolvidas na UNION. Assim, basicamente, um UNION combina os dois conjuntos de resultados juntos.

A operação join busca dados de duas ou mais tabelas com base nas relações lógicas entre essas tabelas, ou seja, com base na condição join. Na consulta de join, os dados de uma tabela são usados para selecionar registros de outra tabela. Ela permite ligar dados semelhantes que estão presentes em diferentes tabelas.

A fim de entendê-la de forma muito simples, você pode dizer que um UNION combina linhas de duas tabelas enquanto um join combina colunas de duas ou mais tabelas. Assim, ambas são usadas para combinar os dados de n tabelas, mas a diferença está em como os dados são combinados.

Below são as representações pictóricas de UNION e JOIN.

UNION e JOIN1

O acima é uma representação pictórica de uma operação de junção, representando 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 join é geralmente o resultado da desnormalização (oposta à normalização) e usa a chave externa de uma tabela para procurar os valores das colunas empregando a chave primária em outra tabela.

UNION e JOIN2

O acima é uma representação pictórica de uma Operação UNION representando 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.

Outra leitura =>> MySQL UNION explicado com exemplos

Conclusão

Neste artigo, vimos as maiores diferenças entre o Inner Join e o Outer Join em SQL. Também vimos a classificação de um Outer Join, ou seja, Left join, Right join e Full join. Vimos como cada um destes tipos de join funciona e como eles variam entre si.

Fizemos também alguma comparação de desempenho entre estes tipos de join. Também discutimos como um join é diferente de um union.

Também Leia =>> Tipos de join MySQL

Espere que este artigo o ajudasse a esclarecer suas dúvidas sobre as diferenças entre os vários tipos de join. Estamos certos de que isto o fará decidir qual o tipo de join a escolher com base no resultado desejado.