Qual é a diferença entre "INNER JOIN" e "OUTER JOIN"?
-
09-06-2019 - |
Pergunta
Também como fazer LEFT JOIN
, RIGHT JOIN
e FULL JOIN
se encaixa?
Solução
Supondo que você está ingressando em colunas sem duplicados, o que é muito comum o caso de:
Uma associação interna de A e B dá o resultado de Uma interseção B, i.e.a parte interna de um Diagrama de Venn intersecção.
Uma associação externa de A e B fornece os resultados de Uma união B, i.e.as partes externas de um diagrama de Venn da união.
Exemplos
Suponha que você tem duas tabelas, com uma única coluna, cada, e os dados da seguinte forma:
A B
- -
1 3
2 4
3 5
4 6
Note que (1,2) são exclusivas para Um, (3,4) são comuns, e (5,6) são exclusivos para B.
Inner join
Um inner join usando o equivalente a consultas dá a intersecção das duas tabelas, i.é.as duas linhas que eles têm em comum.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Left outer join
Uma associação externa à esquerda vai lhe dar todas as linhas em Um, além de qualquer comuns de linhas de B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Right outer join
Uma associação externa direita vai lhe dar todas as linhas de B, mais comum linhas de A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Full outer join
Uma associação externa completa irá dar-lhe a união de A e B, i.e.de todas as linhas e todas as linhas de B.Se algo que não tem um correspondente de referência em B e, em seguida, a porção B é nulo, e vice-versa.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
Outras dicas
Os diagramas de Venn realmente não é para mim.
Eles não mostram qualquer distinção entre um cross join e um inner join, por exemplo, ou, mais geralmente, mostrar qualquer distinção entre os diferentes tipos de predicado de associação ou fornecer um quadro de raciocínio sobre como irão operar.
Não há nenhum substituto para a compreensão da lógica de processamento e é relativamente simples de entender de qualquer maneira.
- Imagine uma associação cruzada.
- Avaliar o
on
cláusula contra todas as linhas a partir do passo 1, mantendo aqueles em que o predicado avalia atrue
- (Para associações externas apenas) adicionar de volta em quaisquer linhas exteriores que foram perdidos no passo 2.
(NB:Na prática, o otimizador de consulta pode encontrar formas mais eficientes de executar a consulta que o puramente lógico descrição acima, mas o resultado final deve ser o mesmo)
Eu vou começar com uma versão animada de um full outer join.Mais explicações a seguir.
Explicação
Tabelas De Origem
Primeiro começar com uma CROSS JOIN
(AKA Produto Cartesiano).Este não tem um ON
cláusula e simplesmente retorna, para cada combinação de linhas das duas tabelas.
SELECIONE A. Cor, B. de Cor a PARTIR de UMA ASSOCIAÇÃO entre B
Associações internas e Externas de um" cláusula do predicado.
- Inner Join. Avaliar a condição "ON" cláusula para todas as linhas na cruz resultado de associação.Se verdadeiro retorno associado linha.Caso contrário, descarte-o.
- Left Outer Join. Mesmo como inner join, em seguida, para as linhas na tabela da esquerda que não corresponde a nada saída destes com valores NULOS para a direita nas colunas da tabela.
- Right Outer Join. Mesmo como inner join, em seguida, para as linhas na tabela à direita que não corresponde a nada saída destes com valores NULOS para a esquerda colunas da tabela.
- Full Outer Join. Mesmo como inner join, em seguida, preservar a esquerda não correspondido linhas como na associação externa esquerda e direita não correspondência de linhas como por right outer join.
Alguns exemplos
SELECIONE A. Cor, B. de Cor a PARTIR de UM INNER JOIN B EM A. Cor = Cor B.
O acima é o clássico equi join.
Versão Animada
SELECIONE A. Cor, B. de Cor a PARTIR de UM INNER JOIN B EM A. Cor, NÃO NA ('Verde','Azul')
O inner join condição não precisa ser, necessariamente, uma igualdade de condição e que não necessita de colunas de referência de ambos (ou mesmo ambos) das tabelas.Avaliação A.Colour NOT IN ('Green','Blue')
em cada linha do cross join retorna.
SELECIONE A. Cor, B. de Cor a PARTIR de UM INNER JOIN B 1 =1
A juntar a condição for avaliada como true para todas as linhas na associação entre resultado, então isso é exatamente o mesmo como uma associação cruzada.Eu não repetir a imagem de 16 linhas novamente.
SELECIONE A. Cor, B. de Cor a PARTIR de UMA ASSOCIAÇÃO EXTERNA à ESQUERDA de B EM A. Cor = Cor B.
Associações externas são logicamente avaliados da mesma forma como associações internas, exceto que, se uma linha da tabela à esquerda (para o left join) não ingressar com as linhas da mão direita tabela a tudo o que é preservado no resultado com NULL
valores para a mão direita colunas.
SELECIONE A. Cor, B. de Cor a PARTIR de UMA ASSOCIAÇÃO EXTERNA à ESQUERDA de B EM A. Cor = B. de Cor ONDE a B. Cor É NULO
Isso limita o resultado anterior para retornar somente as linhas onde B.Colour IS NULL
.Neste caso específico, serão as linhas que foram preservados como eles não tinham o jogo na mão direita da tabela e a consulta retorna o único vermelho linha não correspondido na tabela B
.Isso é conhecido como um anti semi join.
É importante selecionar uma coluna para o IS NULL
teste que é ou não anulável ou para o qual a condição de associação garante que qualquer NULL
os valores serão excluídos, para que este padrão para funcionar corretamente e evitar apenas trazer de volta linhas que acontecer de ter um NULL
valor para a coluna, além da onu de correspondência de linhas.
SELECIONE A. Cor, B. de Cor a PARTIR de UMA ASSOCIAÇÃO EXTERNA à DIREITA de B EM A. Cor = Cor B.
Direito associações externas que actuam de forma semelhante à esquerda junções externas, exceto preservam a não correspondência de linhas da tabela à direita e nulo estender a mão esquerda colunas.
SELECIONE A. Cor, B. Cor DE UMA ASSOCIAÇÃO EXTERNA COMPLETA de B EM A. Cor = Cor B.
Full outer joins combinar o comportamento da esquerda e da direita de associações e preservar a não correspondência de linhas de esquerda e direita tabelas.
SELECIONE A. Cor, B. Cor DE UMA ASSOCIAÇÃO EXTERNA COMPLETA B 1 = 0
Não há linhas em cruz junte-se corresponder o 1=0
predicado.Todas as linhas de ambos os lados são preservados utilizando-se normal exterior de regras de associação com NULL nas colunas da tabela no outro lado.
SELECT COALESCE(A. de Cor, B., de Cor COMO a Cor DE UMA ASSOCIAÇÃO EXTERNA COMPLETA B 1 = 0
Com uma pequena alteração para a consulta anterior poderia simular um UNION ALL
das duas tabelas.
SELECIONE A. Cor, B. de Cor a PARTIR de UMA ASSOCIAÇÃO EXTERNA à ESQUERDA de B EM A. Cor = B. de Cor ONDE a B. Cor = 'Verde'
Observe que o WHERE
cláusula (se presente) logicamente é executado após a associação.Um erro comum é executar uma associação externa à esquerda e, em seguida, incluir uma cláusula WHERE com uma condição na tabela da direita, o que acaba excluindo a não correspondência de linhas.Acima acaba de realizar o outer join...
...E, em seguida, o "Onde" cláusula é executado. NULL= 'Green'
não avaliar para true, para a linha preservada pela associação externa acaba descartado (junto com o azul) efetivamente converter a associação de volta a um interior.
Se a intenção era incluir apenas as linhas de B, onde a Cor é Verde e todas as linhas a partir de Um independentemente a sintaxe correta seria
SELECIONE A. Cor, B. de Cor a PARTIR de UMA ASSOCIAÇÃO EXTERNA à ESQUERDA de B EM A. Cor = B. Cor E B. Cor = 'Verde'
SQL Violino
Veja estes exemplos executar ao vivo no SQLFiddle.com.
Associações são utilizados para combinar os dados de duas tabelas, com o resultado sendo uma nova tabela temporária.Associações são realizadas com base em algo chamado de um predicado, que especifica a condição para usar, a fim de realizar uma união.A diferença entre um inner join e outer join é que um inner join retorna somente as linhas que correspondam efectivamente com base no predicado de associação.Vamos considerar o Empregado e o Local de tabela:
Inner Join:- Inner join cria uma nova tabela de resultados através da combinação de valores de colunas das duas tabelas (Funcionário e Localização baseado na associação de predicado.A consulta compara cada linha de Funcionário com cada linha de Localização para encontrar todos os pares de linhas que satisfazem a juntar-predicado.Quando a associação de predicado está satisfeito por correspondência de valores não NULOS, valores de coluna para cada par correspondente de linhas de Funcionário e Localização são combinados em uma linha do resultado.Aqui está o que o SQL para uma associação interna terá a seguinte aparência:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
Agora, aqui está o resultado da execução do SQL seria:
Outer Join:- Uma associação externa não exigem cada registro de duas tabelas associadas a ter um registo correspondente.A tabela associada mantém cada registro, mesmo se nenhum outro registro correspondente existe.Associações externas subdividir ainda mais em left outer joins e right outer joins, dependendo de qual tabela de linhas são mantidas (esquerda ou direita).
Left Outer Join:- O resultado de uma associação externa esquerda (ou simplesmente left join) para tabelas Funcionário e Localização sempre contém todos os registros de "esquerda" (tabelaFuncionário), mesmo se a associação da condição de não encontrar nenhum registro correspondente no "direito" (tabelaLocalização).Aqui está o que o SQL para uma associação externa à esquerda seria semelhante, utilizando as tabelas acima:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Agora, aqui está o resultado da execução deste SQL seria:
Right Outer Join:- Uma associação externa direita (ou right join) parecida com um left outer join, exceto com o tratamento das tabelas invertida.Cada linha da "direita" (tabelaLocalização) irá aparecer na tabela associada pelo menos uma vez.Se não correspondente linha da "esquerda" (tabelaFuncionário) existe, NULL vai aparecer em colunas de Funcionário para os registros que não têm correspondência no Localização.Isto é o que o SQL parece:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Usando as tabelas acima, pode-se mostrar que o conjunto de resultados de uma associação externa à direita ficaria:
Full Outer Joins:- Full Outer Join ou Total da Associação é manter a não-correspondência de informação, incluindo não-correspondência de linhas nos resultados de uma associação, use uma associação externa completa.Ele inclui todas as linhas de ambas as tabelas, independentemente de estarem ou não a tabela tem um valor correspondente.
Inner Join
Recuperar a correspondência de linhas apenas, que é, A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Left Outer Join
Selecionar todos os registros da primeira tabela, e quaisquer registros na segunda tabela que correspondem a juntou-se chaves.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Full Outer Join
Selecionar todos os registros da segunda tabela, e em todos os registros na primeira tabela que correspondem a juntou-se chaves.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Referências
Em palavras simples:
Um inner join recuperar a correspondência de linhas apenas.
Considerando que um associação externa recuperar a correspondência de linhas de uma tabela e todas as linhas da outra tabela ....o resultado depende do que você estiver usando:
Esquerda:Correspondência de linhas na tabela à direita e todas as linhas da tabela à esquerda
Direito:Correspondência de linhas na tabela da esquerda e todas as linhas na tabela à direita ou
Completo:Todas as linhas de todas as tabelas.Não importa se há um match ou não
Uma associação interna, somente mostra linhas que se não houver um registro correspondente no outro (direito) do lado da associação.
Um (à esquerda) associação externa mostra linhas para cada registro no lado esquerdo, mesmo se não houver nenhuma linha correspondente na outra (direita) do lado da associação.Se não houver registros coincidentes, as colunas para o outro (direito) do lado iria mostrar Nulos.
Associações internas requerem um registro com o ID associado existir na tabela associada.
Associações externas retornará registros para o lado esquerdo, mesmo se nada existe para o lado direito.
Por exemplo, você tem um Encomendas e uma tabela detalhes da encomenda.Eles estão relacionados por uma "OrderID".
Encomendas
- Códigodopedido
- Nome do cliente
OrderDetails
- OrderDetailID
- Códigodopedido
- ProductName
- Qty
- Preço
A pedido
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
irá retornar somente as Ordens que também têm algo a tabela detalhes da encomenda.
Se você alterá-lo para o EXTERIOR LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
em seguida, ele irá retornar os registros da tabela Pedidos, mesmo se eles não têm registros de OrderDetails.
Você pode usar isso para encontrar Ordens que não têm qualquer OrderDetails indicando uma possível órfãos ordem adicionando uma cláusula where, como WHERE OrderDetails.OrderID IS NULL
.
Em palavras simples :
Inner join -> Tome APENAS de registros comuns de tabelas pai e filho, ONDE a chave primária da tabela Pai jogos de chave Estrangeira na tabela Filho.
Left join ->
pseudo-código
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
Direito de associação :Exatamente o oposto do left join .Coloca o nome da tabela de ASSOCIAÇÃO à ESQUERDA no lado direito no Direito de associação , você obtém os mesmos resultados, como LEFT JOIN.
Associação externa :Mostrar todos os registros de Ambas as tabelas No matter what
.Se os registros na tabela da Esquerda não são equivalentes para a direita, tabela com base no Primário , Forieign chave , utilize o valor NULO como resultado da associação .
Exemplo :
Vamos supor agora para 2 tabelas
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
Aqui , empregados de mesa é o Mestre de mesa , phone_numbers_employees é filho de tabela(contém emp_id
como chave externa que se conecta employee.id
assim, seu filho da tabela.)
Associações internas
Tomar os registros das tabelas 2 SOMENTE SE a chave Primária da tabela funcionários(seu id) corresponde a chave Estrangeira da tabela Filho phone_numbers_employees(id_emp).
Para consulta seria :
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Aqui, tome apenas linhas correspondentes na chave primária = chave estrangeira, como explicado acima.Aqui não linhas correspondentes na chave primária = chave estrangeira são ignorados como resultado da associação.
A esquerda junta :
Left join mantém todas as linhas da tabela à esquerda, independentemente de haver ou não uma linha que corresponde à direita da tabela.
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Associações externas :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Diagramatically ele se parece :
Você usa INNER JOIN
para retornar todas as linhas de ambas as tabelas, onde há uma correspondência.i.e.Na tabela resultante de todas as linhas e colunas terão valores.
No OUTER JOIN
a tabela resultante pode ter colunas vazias.Associação externa pode ser LEFT
ou RIGHT
.
LEFT OUTER JOIN
retorna todas as linhas da primeira tabela, mesmo se não houver nenhuma correspondência na segunda tabela.
RIGHT OUTER JOIN
retorna todas as linhas da segunda tabela, mesmo se não houver nenhuma correspondência na primeira tabela.
Este é um bom diagramática explicação para todo o tipo de associações
fonte: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
INNER JOIN
requer existe pelo menos um jogo na comparação entre as duas tabelas.Por exemplo, A tabela e A tabela B, o que implica Uma ٨ B (A intersecção B).
LEFT OUTER JOIN
e LEFT JOIN
são os mesmos.Ele dá todos os registros correspondentes em ambas as tabelas e todas as possibilidades da tabela da esquerda.
Da mesma forma, RIGHT OUTER JOIN
e RIGHT JOIN
são os mesmos.Ele dá todos os registros correspondentes em ambas as tabelas e todas as possibilidades da tabela da direita.
FULL JOIN
é a combinação de LEFT OUTER JOIN
e RIGHT OUTER JOIN
sem duplicação.
A resposta está no significado de cada um, portanto, nos resultados.
Nota :
NoSQLite
não háRIGHT OUTER JOIN
ouFULL OUTER JOIN
.
E também emMySQL
não háFULL OUTER JOIN
.
A minha resposta é baseado no acima Nota.
Quando você tem duas tabelas, como estas:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
CROSS JOIN / OUTER JOIN :
Você pode ter todas as tabelas de dados com CROSS JOIN
ou apenas com ,
como esta:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
INNER JOIN :
Quando você deseja adicionar um filtro para resultados acima, com base em uma relação como table1.id = table2.id
você pode usar INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
ESQUERDA [OUTER] JOIN :
Quando você quer ter todas as linhas de uma das tabelas acima o resultado, com a mesma relação - você pode usar LEFT JOIN
:
(Para DIREITO DE ASSOCIAÇÃO apenas a mudança de lugar das tabelas)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
FULL OUTER JOIN :
Quando você também quer ter todas as linhas da outra tabela em seus resultados que você pode usar FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
Bem, como sua necessidade você a escolher cada uma que cobre a sua necessidade ;).
Inner join.
Uma associação é a combinação de linhas de duas tabelas.Um inner join tentativas de igualar-se duas tabelas com base nos critérios que você especificar na consulta e retorna somente as linhas que correspondem.Se uma linha da primeira tabela na associação corresponde a duas linhas da segunda tabela e, em seguida, duas linhas serão devolvidos nos resultados.Se há uma linha da primeira tabela que não correspondem a uma linha na segunda, não devolvidos;da mesma forma, se há uma linha da segunda tabela que não correspondem a uma linha na primeira, ele não é devolvido.
Associação Externa.
Um left join tenta encontrar corresponder as linhas da primeira tabela para linhas da segunda tabela.Se ele não encontrar uma correspondência, ele irá retornar as colunas da primeira tabela e deixar as colunas da segunda tabela em branco (nulo).
Eu não vejo muito detalhes sobre o desempenho e otimizador em outras respostas.
Às vezes, é bom saber que só INNER JOIN
é associativa, o que significa que o otimizador não tem mais a opção de jogar com ele.É possível reorganizar a ordem de associação para torná-lo mais rápido, mantendo o mesmo resultado.O otimizador pode usar a maioria dos modos de associação.
Geralmente é uma boa prática para tentar usar INNER JOIN
em vez de os diferentes tipos de associações.(Claro, se é possível, considerando o conjunto de resultado esperado.)
Há um par de bons exemplos e a explicação aqui sobre esse estranho comportamento associativo:
Preciso algoritmo para INNER JOIN
, LEFT/RIGHT OUTER JOIN
são as seguintes:
- Tome cada linha da primeira tabela:
a
- Considere todas as linhas da segunda tabela ao lado:
(a, b[i])
- Avaliar o
ON ...
cláusula contra cada par:ON( a, b[i] ) = true/false?
- Quando a condição for avaliada como
true
, retorno que combinado linha(a, b[i])
. - Quando chegar ao fim da segunda tabela, sem qualquer correspondência, e este é um
Outer Join
em seguida, retornar um (virtual) par usandoNull
para todas as colunas da tabela:(a, Null)
para LEFT outer join ou(Null, b)
para RIGHT outer join.Isso é para garantir que todas as linhas da primeira tabela existe no resultado final.
- Quando a condição for avaliada como
Nota: a condição especificada na ON
cláusula poderia ser qualquer coisa, isso não é necessário para usar Chaves Primárias (e você não precisa sempre fazer referência a Colunas de duas tabelas)!Por exemplo:
... ON T1.title = T2.title AND T1.version < T2.version
( => veja este post como um exemplo de uso: Selecione apenas as linhas com valor máximo de uma coluna)... ON T1.y IS NULL
... ON 1 = 0
(apenas como exemplo)
Nota: Left Join = Left Outer Join, Right Join = Right Outer Join.
Ter criticado o bem-amado vermelho-sombreada do diagrama de Venn, eu pensei que só justo para postar a minha própria tentativa.
Apesar @Martin Smith, a resposta é o melhor do grupo por um longo caminho, o seu só mostra a coluna de chave de cada tabela, enquanto que eu acho que o ideal colunas não chave deve também ser mostrado.
O melhor que eu podia fazer em meia hora permitido, eu ainda não acho que seja adequadamente mostra que os valores nulos existem devido à ausência de valores de chave em TableB
ou que OUTER JOIN
é, na verdade, uma união em vez de uma associação:
INNER JOIN
mais típico de associação de duas ou mais tabelas.Ele retorna de correspondência de dados na tabela NO chaveprimária e forignkey relação.OUTER JOIN
é mesmo comoINNER JOIN
, mas ele também incluemNULL
de dados no conjunto de Resultados.LEFT JOIN
=INNER JOIN
+ Incomparável de dados de esquerda tabela comNull
correspondência na tabela da direita.RIGHT JOIN
=INNER JOIN
+ Incomparável de dados de direito tabela comNull
correspondência na tabela da esquerda.FULL JOIN
=INNER JOIN
+ Incomparável de dados em direita e esquerda tabelas comNull
jogos.
- Auto associação não é uma palavra-chave no SQL, quando uma tabela de referências de dados em si, sabe como auto-associação.Usando
INNER JOIN
eOUTER JOIN
podemos escrever a auto consultas.
Por exemplo:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
Mais Simples Definições
Inner Join:Retorna registros correspondentes a partir de ambas as tabelas.
Full Outer Join:Retorna de correspondência e registros não coincidentes a partir de ambas as tabelas com null para registros não coincidentes de Ambas As Tabelas.
Left Outer Join:Retorna combinados e incomparável somente os registros da tabela em Lado Esquerdo.
Right Outer Join:Retorna combinados e incomparável somente os registros da tabela em Lado Direito.
Em Breve
Correspondência Esquerda + Ímpar + Direita Incomparável = Full Outer Join
Correspondência Esquerda + Ímpar = Left Outer Join
Correspondência De + Direito Incomparável = Right Outer Join
Correspondência = Inner Join
Em Termos Simples,
1.INNER JOIN OU EQUI JOIN : Retorna o conjunto de resultados que corresponde apenas a condição em ambas as tabelas.
2.OUTER JOIN : Retorna o conjunto de resultados de todos os valores de ambas as tabelas, mesmo se não houver condição de corresponder ou não.
3.LEFT JOIN : Retorna o conjunto de resultados de todos os valores da tabela da esquerda e apenas as linhas que correspondem a condição na tabela da direita.
4.DIREITO DE ASSOCIAÇÃO : Retorna o conjunto de resultados de todos os valores da tabela para a direita e apenas as linhas que correspondem a condição na tabela da esquerda.
5.FULL JOIN : Adesão total e Full outer Join são as mesmas.
1.Inner Join: Também chamado de Associação.Ele retorna as linhas presentes tanto a tabela da Esquerda, e à direita uma mesa se houver uma correspondência.Caso contrário, ele retorna zero registros.
Exemplo:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2.Full Outer Join: Também chamado de adesão Total.Ele retorna todas as linhas presente em ambos a tabela da Esquerda e da direita da tabela.
Exemplo:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3.Left Outer join: Ou simplesmente chamado como Left Join.Ele retorna todas as linhas presentes na tabela à Esquerda e linhas correspondentes da tabela da direita (se houver).
4.Right Outer Join: Chamado também como o Direito de Associação.Ele retorna linhas correspondentes da tabela da esquerda (se houver), e todas as linhas presentes na tabela à Direita.
Vantagens das Junções
- Executa mais rápido.
Inner join - Um inner join usando o equivalente a consultas dá a intersecção dos dois tabelas, i.é.as duas linhas que eles têm em comum.
Left outer join - Um left outer join vai dar todas as linhas em Um, além de qualquer comuns de linhas de B.
Full outer join - Um full outer join vai dar-lhe a união de A e B, i.e.De todas as linhas e todas as linhas de B.Se algo que não tem um correspondente de referência em B e, em seguida, a porção B é nulo, e vice-versay
left join on
(aka left outer join on
) retorna inner join on
linhas union all
incomparável esquerda linhas da tabela prorrogado por valores nulos.
right join (on
aka right outer join on
) retorna inner join on
linhas union all
incomparável direito de linhas da tabela prorrogado por valores nulos.
full join on
(aka full outer join on
) retorna inner join on
linhasunion all
incomparável esquerda linhas da tabela estendida por nulos union all
incomparável direito de linhas da tabela prorrogado por valores nulos.
(Padrão SQL 2006 SQL/Foundation 7.7 Regras de Sintaxe 1, Regras Gerais 1-b, 3-c & d, 5-b.)
Portanto, não outer join
até você saber o que subjacente inner join
está envolvido.
Descubra quais linhas inner join
retorna.
Leia meus comentários lá voltar muitas confuso e pobres respostas.
Em seguida, leia os meus comentários aqui novamente a muitos confuso e pobres respostas.
A diferença entre o inner join e outer join é como a seguir:
- Inner join é uma associação que combinado tabelas com base na correspondência de tuplas, enquanto a exterior é uma junção que combinado tabela com base em ambos combinados e inigualável de tupla.
- Inner join mescla de correspondência de linhas de duas tabelas onde incomparável linha são omitidos, considerando que a associação externa mescla de linhas de duas tabelas e incomparável linhas preencher com o valor null.
- Inner join é como um cruzamento de operação, considerando que a outer join é como uma operação de união.
- Associação interna é de dois tipos, enquanto que a associação externa são de três tipos.
- Inner join é mais lento, enquanto que a associação externa é mais rápido do que o inner join.
Considere abaixo de 2 tabelas:
EMP
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
Departamento
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
Inner Join:
A maioria escrita apenas como PARTICIPAR em consultas sql.Ele retorna somente os registros correspondentes entre as tabelas.
Descubra todos os funcionários e suas departamento de nomes:
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
Como você pode ver acima, Jose
não é impresso a partir de EMP na saída, como é dept_id 6
não encontrar uma correspondência no Departamento de tabela.Da mesma forma, HR
e R&D
linhas não são impressos a partir de Departamento tabela de como eles não encontrar uma correspondência na tabela Emp.
Assim, INNER JOIN ou simplesmente ASSOCIAÇÃO, retorna somente as linhas coincidentes.
LEFT JOIN :
Este retorna todos os registros da tabela da ESQUERDA e apenas os registos correspondentes da tabela da DIREITA.
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
Assim, se você observar a saída acima, todos os registros da tabela da ESQUERDA(Emp) são impressos apenas com correspondência de registros da tabela à DIREITA.
HR
e R&D
linhas não são impressos a partir de Departamento tabela de como eles não encontrar uma correspondência na tabela Emp no dept_id.
Assim, LEFT JOIN retorna TODAS as linhas da tabela à Esquerda e apenas linhas correspondentes da tabela da DIREITA.
Também pode verificar PENTEADOS aqui.