Também como LEFT JOIN
, RIGHT JOIN
e se FULL JOIN
encaixa?
sql
database
join
inner-join
outer-join
Chris de Vries
fonte
fonte
Respostas:
Supondo que você esteja ingressando em colunas sem duplicatas, é um caso muito comum:
Uma junção interna de A e B fornece o resultado da interseção A, ou seja, a parte interna de uma interseção do diagrama de Venn .
Uma junção externa de A e B fornece os resultados da união A, ou seja, as partes externas de uma união do diagrama de Venn.
Exemplos
Suponha que você tenha duas tabelas, com uma única coluna cada, e os dados da seguinte maneira:
Observe que (1,2) são únicos para A, (3,4) são comuns e (5,6) são únicos para B.
Junção interna
Uma junção interna usando uma das consultas equivalentes fornece a interseção das duas tabelas, ou seja, as duas linhas que elas têm em comum.
Junção externa esquerda
Uma junção externa esquerda fornecerá todas as linhas em A, mais as linhas comuns em B.
Junção externa direita
Uma junção externa direita fornecerá todas as linhas em B, mais as linhas comuns em A.
Junção externa completa
Uma junção externa completa fornecerá a união de A e B, ou seja, todas as linhas em A e todas as linhas em B. Se algo em A não tiver um dado correspondente em B, a parte B será nula e vice-versa. versa.
fonte
Os diagramas de Venn realmente não fazem isso por mim.
Eles não mostram nenhuma distinção entre uma junção cruzada e uma junção interna, por exemplo, ou geralmente mostram qualquer distinção entre diferentes tipos de predicado de junção ou fornecem uma estrutura para raciocinar sobre como eles irão operar.
Não há substituto para a compreensão do processamento lógico e é relativamente simples de entender de qualquer maneira.
on
cláusula em todas as linhas da etapa 1, mantendo aquelas nas quais o predicado avalia comotrue
(Observação: na prática, o otimizador de consulta pode encontrar maneiras mais eficientes de executar a consulta do que a descrição puramente lógica acima, mas o resultado final deve ser o mesmo)
Vou começar com uma versão animada de uma junção externa completa . Mais explicações a seguir.
Explicação
Tabelas de origem
Comece primeiro com um
CROSS JOIN
(produto cartesiano AKA). Isso não possui umaON
cláusula e simplesmente retorna todas as combinações de linhas das duas tabelas.SELECIONE A.Cor, B.Cor A partir de uma junção cruzada B
Associações interna e externa têm um predicado de cláusula "ON".
Alguns exemplos
SELECIONE A.Colour, B.Colour A PARTIR DE UMA UNIDADE INTERIOR B EM A.Colour = B.Colour
A descrição acima é a junção equi clássica.
Versão Animada
SELECIONE A.Cor, B.Cor A partir de uma junção interna B em A.Cor NÃO IN ('Verde', 'Azul')
A condição de junção interna não precisa necessariamente ser uma condição de igualdade e não precisa fazer referência a colunas de ambas (ou mesmo de uma) das tabelas. A avaliação
A.Colour NOT IN ('Green','Blue')
em cada linha da junção cruzada retorna.SELECIONE A.Cor, B.Cor A PARTIR DE UMA UNIÃO INTERIOR B EM 1 = 1
A condição de junção é avaliada como verdadeira para todas as linhas no resultado da junção cruzada, portanto, é exatamente o mesmo que uma junção cruzada. Não vou repetir a imagem das 16 linhas novamente.
SELECIONE A.Cor, B.Cor A partir de uma junção externa esquerda B em A.Cor = B.Cor
Junções externas são avaliadas logicamente da mesma maneira que junções internas, exceto se uma linha da tabela esquerda (para uma junção esquerda) não se unir a nenhuma linha da tabela à direita, ela é preservada no resultado com
NULL
valores para o colunas da direita.SELECIONE A.Cor, B.Cor A partir de uma junção externa esquerda B em A.Cor = B.Cor WHERE B.Cor É NULL
Isso simplesmente restringe o resultado anterior para retornar apenas as linhas onde
B.Colour IS NULL
. Nesse caso em particular, essas serão as linhas que foram preservadas, pois não tinham correspondência na tabela à direita e a consulta retorna a única linha vermelha que não corresponde à tabelaB
. Isso é conhecido como uma junção anti-semi.É importante selecionar uma coluna para o
IS NULL
teste que não seja anulável ou para o qual a condição de junção garanta aNULL
exclusão de quaisquer valores para que esse padrão funcione corretamente e evite apenas trazer de volta as linhas que possuem umNULL
valor para esse padrão. coluna, além das linhas não correspondidas.SELECIONE A.Cor, B.Cor A PARTIR DE UMA JUNTA EXTERIOR CERTA B EM A.Cor = B.Cor
As junções externas à direita agem de maneira semelhante às junções externas à esquerda, exceto que preservam linhas não correspondentes da tabela direita e estendem nulo as colunas à esquerda.
SELECIONE A.Colour, B.Colour DE UMA JUNTA EXTERNA COMPLETA B EM A.Colour = B.Colour
As junções externas completas combinam o comportamento das junções esquerda e direita e preservam as linhas não correspondentes das tabelas esquerda e direita.
SELECIONE A.Cor, B. Cor DE UMA JUNTA EXTERNA COMPLETA B ON 1 = 0
Nenhuma linha na junção cruzada corresponde ao
1=0
predicado. Todas as linhas de ambos os lados são preservadas usando regras normais de junção externa com NULL nas colunas da tabela do outro lado.SELECIONAR COALESCE (A.Cor, B.Colour) como cor de uma junção externa completa B ON 1 = 0
Com uma pequena alteração na consulta anterior, era possível simular uma
UNION ALL
das duas tabelas.SELECIONE A.Cor, B.Cor A partir de uma junção externa esquerda B em A.Cor = B.Cor WHERE B.Cor = 'Verde'
Observe que a
WHERE
cláusula (se presente) é executada logicamente após a associação. Um erro comum é executar uma junção externa esquerda e incluir uma cláusula WHERE com uma condição na tabela direita que acaba excluindo as linhas não correspondentes. O exemplo acima acaba executando a junção externa ...... E então a cláusula "Where" é executada.
NULL= 'Green'
não é avaliado como verdadeiro, de modo que a linha preservada pela junção externa acaba sendo descartada (junto com a azul) efetivamente convertendo a junção novamente em interna.Se a intenção fosse incluir apenas linhas de B, em que Cor é Verde, e todas as linhas de A, independentemente da sintaxe correta.
SELECIONE A.Cor, B.Cor A partir de uma junção externa esquerda B em A.Cor = B.Cor e B.Cor = 'Verde'
SQL Fiddle
Veja estes exemplos executados ao vivo no SQLFiddle.com .
fonte
As junções são usadas para combinar os dados de duas tabelas, com o resultado sendo uma nova tabela temporária. As junções são realizadas com base em algo chamado predicado, que especifica a condição a ser usada para realizar uma junção. A diferença entre uma junção interna e uma junção externa é que uma junção interna retornará apenas as linhas que realmente correspondem com base no predicado da junção. Por exemplo: vamos considerar a tabela Empregado e Local:
Junção interna: - A junção interna cria uma nova tabela de resultados combinando os valores da coluna de duas tabelas ( Funcionário e Local ) com base no predicado de junção. A consulta compara cada linha de Employee com cada linha de Location para encontrar todos os pares de linhas que satisfazem o predicado de junção. Quando o predicado de junção é satisfeito pela correspondência de valores não NULL, os valores da coluna para cada par de linhas correspondentes de Employee e Location são combinados em uma linha de resultado. Aqui está a aparência do SQL para uma junção interna:
Agora, aqui está como seria o resultado da execução desse SQL:
Associação externa: - Uma associação externa não exige que cada registro nas duas tabelas associadas tenha um registro correspondente. A tabela unida retém cada registro - mesmo que não exista outro registro correspondente. As junções externas subdividem-se ainda mais em junções externas esquerdas e externas, dependendo de quais linhas da tabela são mantidas (esquerda ou direita).
Junção Externa Esquerda: - O resultado de uma junção externa esquerda (ou simplesmente junção esquerda) para as tabelas Employee e Location sempre contém todos os registros da tabela "esquerda" ( Employee ), mesmo que a condição de junção não encontre nenhum registro correspondente em a tabela "certa" ( localização ). Aqui está a aparência do SQL para uma junção externa esquerda, usando as tabelas acima:
Agora, aqui está como seria o resultado da execução desse SQL:
Junção externa direita: - Uma junção externa direita (ou junção direita) se assemelha bastante a uma junção externa esquerda, exceto com o tratamento das tabelas invertidas. Cada linha da tabela "direita" ( Local ) aparecerá na tabela unida pelo menos uma vez. Se não existir nenhuma linha correspondente da tabela "esquerda" ( Funcionário ), NULL aparecerá nas colunas de Funcionário para os registros que não têm correspondência no Local . É assim que o SQL se parece:
Usando as tabelas acima, podemos mostrar como seria o conjunto de resultados de uma junção externa direita:
Junções externas completas: - Junção externa completa ou Junção completa serve para reter as informações não correspondentes incluindo linhas não correspondentes nos resultados de uma junção, use uma junção externa completa. Inclui todas as linhas de ambas as tabelas, independentemente de a outra tabela ter ou não um valor correspondente.
Fonte da imagem
Manual de Referência do MySQL 8.0 - Sintaxe de junção
Operações do Oracle Join
fonte
Junção interna
Recupere apenas as linhas correspondentes, ou seja
A intersect B
,.Junção externa esquerda
Selecione todos os registros da primeira tabela e quaisquer registros na segunda tabela que correspondam às chaves unidas.
Junção externa completa
Selecione todos os registros da segunda tabela e quaisquer registros na primeira tabela que correspondam às chaves unidas.
Referências
Exemplos de junções internas e externas SQL e o bloco Join
SQL: JOINS
fonte
Em palavras simples:
Uma junção interna recupera apenas as linhas correspondentes.
Enquanto uma junção externa recupera as linhas correspondentes de uma tabela e todas as linhas da outra tabela .... o resultado depende de qual você está usando:
Esquerda : linhas correspondentes na tabela direita e todas as linhas na tabela esquerda
Direita : linhas correspondentes na tabela esquerda e todas as linhas na tabela direita ou
Completo : todas as linhas em todas as tabelas. Não importa se há uma correspondência ou não
fonte
Uma junção interna mostra apenas linhas se houver um registro correspondente no outro lado (direito) da junção.
Uma junção externa (esquerda) mostra linhas para cada registro no lado esquerdo, mesmo se não houver linhas correspondentes no outro lado (direito) da junção. Se não houver linha correspondente, as colunas do outro lado (direito) mostrariam NULLs.
fonte
Associações internas exigem que um registro com um ID relacionado exista na tabela associada.
As junções externas retornarão registros para o lado esquerdo, mesmo que não exista nada para o lado direito.
Por exemplo, você tem uma tabela Orders e uma OrderDetails. Eles são relacionados por um "CódigoDoPedido".
Encomendas
Detalhes do pedido
O pedido
retornará apenas pedidos que também possuem algo na tabela OrderDetails.
Se você alterá-lo para OUTER LEFT JOIN
em seguida, ele retornará registros da tabela Pedidos, mesmo que eles não tenham registros OrderDetails.
Você pode usar isso para encontrar pedidos que não possuem nenhum OrderDetails indicando um possível pedido órfão adicionando uma cláusula where como
WHERE OrderDetails.OrderID IS NULL
.fonte
SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
paraSELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
(MySQL) com sucesso. Eu não tinha certeza sobre as condições adicionais, eles misturam bem ...Em palavras simples:
Junção interna -> Obtenha SOMENTE registros comuns das tabelas pai e filho WHERE a chave primária da tabela pai corresponde à chave estrangeira na tabela filho.
Associação à esquerda ->
pseudo-código
Junção direita : exatamente o oposto da junção esquerda. Coloque o nome da tabela em LEFT JOIN no lado direito em Right join, você obtém a mesma saída que LEFT JOIN.
Junção externa : mostra todos os registros nas duas tabelas
No matter what
. Se os registros na tabela Esquerda não corresponderem à tabela direita com base na chave Primária e Externa, use o valor NULL como resultado da associação.Exemplo:
Vamos assumir agora para 2 tabelas
1.employees , 2.phone_numbers_employees
Aqui, a tabela employee é a tabela Master, phone_numbers_employees é a tabela filho (ela contém uma
emp_id
chave estrangeira que conectaemployee.id
sua tabela filho).Junções internas
Pegue os registros de 2 tabelas SOMENTE SE A chave primária da tabela de funcionários (seu ID) corresponde à chave estrangeira da tabela filho phone_numbers_employees (emp_id) .
Portanto, a consulta seria:
Aqui, pegue apenas as linhas correspondentes na chave primária = chave estrangeira, conforme explicado acima. Aqui, as linhas não correspondentes na chave primária = chave estrangeira são ignoradas como resultado da junção.
Junções à esquerda :
A junção esquerda mantém todas as linhas da tabela esquerda, independentemente de haver uma linha que corresponda à tabela direita.
Junções externas :
Diagramaticamente, ele se parece com:
fonte
Você usa
INNER JOIN
para retornar todas as linhas das duas tabelas em que há uma correspondência. ou seja, na tabela resultante, todas as linhas e colunas terão valores.Na
OUTER JOIN
tabela resultante pode ter colunas vazias. A junção externa pode serLEFT
ouRIGHT
.LEFT OUTER JOIN
retorna todas as linhas da primeira tabela, mesmo se não houver correspondências na segunda tabela.RIGHT OUTER JOIN
retorna todas as linhas da segunda tabela, mesmo se não houver correspondências na primeira tabela.fonte
Esta é uma boa explicação diagramática para todos os tipos de junções
fonte: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
fonte
INNER JOIN
requer que haja pelo menos uma correspondência na comparação das duas tabelas. Por exemplo, a tabela A e a tabela B, que implica A ٨ B (interseção A).LEFT OUTER JOIN
eLEFT JOIN
são iguais. Ele fornece todos os registros correspondentes nas duas tabelas e todas as possibilidades da tabela esquerda.Da mesma forma,
RIGHT OUTER JOIN
eRIGHT JOIN
são os mesmos. Ele fornece todos os registros correspondentes nas duas tabelas e todas as possibilidades da tabela correta.FULL JOIN
é a combinação deLEFT OUTER JOIN
eRIGHT OUTER JOIN
sem duplicação.fonte
A resposta está no significado de cada um, assim nos resultados.
Minha resposta é baseada na nota acima .
Quando você tem duas tabelas como estas:
CROSS JOIN / OUTTER JOIN:
Você pode ter todos esses dados de tabelas com
CROSS JOIN
ou apenas os,
seguintes:INNER JOIN:
Quando você deseja adicionar um filtro aos resultados acima com base em uma relação como a que
table1.id = table2.id
você pode usarINNER JOIN
:ESQUERDA [EXTERNA] JOIN:
Quando você quiser ter todas as linhas de uma das tabelas no resultado acima, com a mesma relação, poderá usar
LEFT JOIN
:(Para RIGHT JOIN, basta mudar o local das tabelas)
JUNÇÃO EXTERNA COMPLETA:
Quando você também quiser ter todas as linhas da outra tabela em seus resultados, poderá usar
FULL OUTER JOIN
:Bem, conforme sua necessidade, você escolhe cada uma que atenda às suas necessidades;).
fonte
full outer join
no MySQL.Junção interna.
Uma junção está combinando as linhas de duas tabelas. Uma junção interna tenta corresponder as duas tabelas com base nos critérios especificados na consulta e retorna apenas as linhas correspondentes. Se uma linha da primeira tabela na junção corresponder a duas linhas na segunda tabela, duas linhas serão retornadas nos resultados. Se houver uma linha na primeira tabela que não corresponda a uma linha na segunda, ela não será retornada; da mesma forma, se houver uma linha na segunda tabela que não corresponda a uma linha na primeira, ela não será retornada.
Junção externa.
Uma junção esquerda tenta encontrar as linhas correspondentes da primeira tabela às linhas da segunda tabela. Se não conseguir encontrar uma correspondência, retornará as colunas da primeira tabela e deixará as colunas da segunda tabela em branco (nulo).
fonte
INNER JOIN
junção mais típica para duas ou mais tabelas. Retorna a correspondência de dados na tabela ON primarykey e forignkey.OUTER JOIN
é o mesmo queINNER JOIN
, mas também incluiNULL
dados no ResultSet.LEFT JOIN
=INNER JOIN
+ Dados incomparáveis da tabela esquerda comNull
correspondência na tabela direita.RIGHT JOIN
=INNER JOIN
+ Dados incomparáveis da tabela da direita comNull
correspondência na tabela da esquerda.FULL JOIN
=INNER JOIN
+ Dados incomparáveis nas tabelas direita e esquerda comNull
correspondências.INNER JOIN
eOUTER JOIN
podemos escrever consultas de auto-junção.Por exemplo:
fonte
Não vejo muitos detalhes sobre desempenho e otimizador nas outras respostas.
Às vezes é bom saber que apenas
INNER JOIN
é associativo, o que significa que o otimizador tem mais opções para brincar com ele. Ele pode reordenar a ordem de junção para torná-lo mais rápido, mantendo o mesmo resultado. O otimizador pode usar a maioria dos modos de junção.Geralmente, é uma boa prática tentar usar em
INNER JOIN
vez dos diferentes tipos de junções. (Obviamente, se for possível, considerando o conjunto de resultados esperado.)Existem alguns bons exemplos e explicações aqui sobre esse estranho comportamento associativo:
fonte
INNER JOIN
é mais lento do queLEFT JOIN
na maioria das vezes, E as pessoas podem usar emLEFT JOIN
vez deINNER JOIN
adicionar umWHERE
para removerNULL
resultados inesperados ;).INNER
é mais lento?Tendo criticado o muito amado diagrama de Venn em tom de vermelho, achei justo postar minha própria tentativa.
Embora a resposta de @Martin Smith seja o melhor desse grupo, ele só mostra a coluna chave de cada tabela, enquanto eu acho que idealmente colunas não chave também devem ser mostradas.
O melhor que pude fazer na meia hora permitida, ainda não acho que isso mostre adequadamente que os nulos estão lá devido à ausência de valores-chave
TableB
ou queOUTER JOIN
na verdade é uma união e não uma união:fonte
TableA a LEFT OUTER JOIN TableB b
porTableB B RIGHT OUTER JOIN TableA a
O algoritmo preciso para
INNER JOIN
,LEFT/RIGHT OUTER JOIN
são os seguintes:a
(a, b[i])
ON ...
cláusula em relação a cada par:ON( a, b[i] ) = true/false?
true
, retorne a linha combinada(a, b[i])
.Outer Join
retorne um par (virtual) usandoNull
para todas as colunas da outra tabela:(a, Null)
para junção externa ESQUERDA ou(Null, b)
junção externa DIREITA. Isso é para garantir que todas as linhas da primeira tabela existam nos resultados finais.Nota: a condição especificada na
ON
cláusula pode ser qualquer coisa, não é necessário usar Chaves Primárias (e você não precisa sempre consultar as Colunas das duas tabelas)! Por exemplo:... ON T1.title = T2.title AND T1.version < T2.version
(=> veja esta postagem como um exemplo de uso: selecione apenas linhas com valor máximo em uma coluna )... ON T1.y IS NULL
... ON 1 = 0
(apenas como amostra)Nota: Junção esquerda = Junção externa esquerda, Junção direita = Junção externa direita.
fonte
Definições mais simples
Junção interna: retorna registros correspondentes das duas tabelas.
Junção externa completa: retorna registros correspondentes e não correspondentes de ambas as tabelas com nulo para registros não correspondentes de ambas as tabelas .
Junção externa esquerda: retorna registros correspondentes e não correspondentes apenas da tabela no lado esquerdo .
União externa direita: retorna registros correspondentes e não correspondentes somente da tabela no lado direito .
Em resumo
Corresponde + Esquerda sem correspondência + Direita sem correspondência = Junção externa completa
Corresponde + Esquerda sem correspondência = Junção externa esquerda
Combinado + Direito incomparável = União externa direita
Correspondido = Junção interna
fonte
Em termos simples,
1. JUNÇÃO INTERNA OU EQUI JUNTA: Retorna o conjunto de resultados que corresponde apenas à condição nas duas tabelas.
2. JUNÇÃO EXTERNA: Retorna o conjunto de resultados de todos os valores de ambas as tabelas, mesmo que haja uma condição correspondente ou não.
3. JUNTA ESQUERDA: Retorna o conjunto de resultados de todos os valores da tabela esquerda e apenas das linhas que correspondem à condição na tabela direita.
4. JUNTA CERTA: Retorna o conjunto de resultados de todos os valores da tabela direita e apenas das linhas que correspondem à condição na tabela esquerda.
5. JUNÇÃO COMPLETA: Junção completa e Junção externa completa são iguais.
fonte
Existem principalmente dois tipos principais de JOINs no SQL: [INNER e OUTER]
Exemplos
Suponha que você tenha duas tabelas, com uma única coluna cada, e os dados da seguinte maneira:
Observe que (1,2,7,8) são únicos para A, (3,4) são comuns e (5,6) são únicos para B.
A palavra-chave INNER JOIN seleciona todas as linhas de ambas as tabelas, desde que a condição seja satisfatória. Essa palavra-chave criará o conjunto de resultados combinando todas as linhas de ambas as tabelas em que a condição satisfaz, ou seja, o valor do campo comum será o mesmo.
Resultado:
Essa junção retorna todas as linhas da tabela no lado esquerdo da junção e as linhas correspondentes para a tabela no lado direito da junção. As linhas para as quais não há linha correspondente no lado direito, o conjunto de resultados conterá nulo. LEFT JOIN também é conhecido como
LEFT OUTER JOIN
.Resultado:
Resultado:
JUNÇÃO COMPLETA (EXTERIOR) :
FULL JOIN cria o conjunto de resultados combinando o resultado de LEFT JOIN e RIGHT JOIN. O conjunto de resultados conterá todas as linhas das duas tabelas. As linhas para as quais não há correspondência, o conjunto de resultados conterá valores NULL.
Resultado:
fonte
Junção interna - uma junção interna usando uma das consultas equivalentes fornece a interseção das duas tabelas , ou seja, as duas linhas que elas têm em comum.
Junção externa esquerda - uma junção externa esquerda fornecerá todas as linhas em A, mais as linhas comuns em B.
Junção externa completa - Uma junção externa completa fornecerá a união de A e B, ou seja, Todas as linhas em A e todas as linhas em B. Se algo em A não tiver um dado correspondente em B, a parte B será nulo e vice-versa
fonte
Join is not an intersection unless the tables have the same columns
Não. Você pode ingressar em qualquer coluna que desejar e, se o valor corresponder, elas se unirão.1. Junção interna: também chamada de Junção. Ele retorna as linhas presentes na tabela Esquerda e na tabela direita somente se houver uma correspondência . Caso contrário, ele retornará zero registros.
Exemplo:
2. Junção externa completa: também chamada de Junção completa. Retorna todas as linhas presentes nas tabelas esquerda e direita.
Exemplo:
3. Junção externa esquerda: ou simplesmente chamado como Junção esquerda. Retorna todas as linhas presentes na tabela esquerda e as linhas correspondentes da tabela direita (se houver).
4. Junção externa direita: também chamada de Junta direita. Ele retorna linhas correspondentes da tabela esquerda (se houver) e todas as linhas presentes na tabela Direita.
Vantagens das junções
fonte
Considere abaixo 2 tabelas:
EMP
Departamento
Junção interna:
Principalmente escrito como JOIN em consultas sql. Retorna apenas os registros correspondentes entre as tabelas.
Descubra todos os funcionários e seus nomes de departamento:
Como você vê acima,
Jose
não é impresso no EMP na saída, pois o dept_id6
não encontra uma correspondência na tabela Departamento. Da mesma forma,HR
e asR&D
linhas não são impressas no Departamento tabela , pois não encontraram uma correspondência na tabela Emp.Portanto, INNER JOIN ou apenas JOIN, retorna apenas as linhas correspondentes.
ASSOCIAÇÃO À ESQUERDA :
Isso retorna todos os registros da tabela ESQUERDA e apenas os registros correspondentes da tabela DIREITA.
Portanto, se você observar a saída acima, todos os registros da tabela ESQUERDA (Emp) serão impressos apenas com registros correspondentes da tabela DIREITA.
HR
e asR&D
linhas não são impressas na tabela Departamento , pois não encontraram uma correspondência na tabela Emp em dept_id.Portanto, LEFT JOIN retorna TODAS as linhas da tabela Esquerda e apenas as linhas correspondentes da tabela RIGHT.
Também pode verificar a DEMO aqui .
fonte
A idéia geral
Por favor, veja a resposta de Martin Smith para obter melhores ilustrações e explicações sobre as diferentes junções, incluindo e especialmente as diferenças entre
FULL OUTER JOIN
,RIGHT OUTER JOIN
eLEFT OUTER JOIN
.Essas duas tabelas formam uma base para a representação dos
JOIN
s abaixo:CROSS JOIN
O resultado serão os produtos cartesianos de todas as combinações. Nenhuma
JOIN
condição necessária:JUNÇÃO INTERNA
INNER JOIN
é o mesmo que simplesmente:JOIN
O resultado serão combinações que satisfazem a
JOIN
condição necessária :JUNTA EXTERNA ESQUERDA
LEFT OUTER JOIN
é o mesmo queLEFT JOIN
O resultado será tudo,
citizen
mesmo que não haja correspondênciaspostalcode
. Novamente, umaJOIN
condição é necessária:Dados para jogar
Todos os exemplos foram executados em um Oracle 18c. Eles estão disponíveis no dbfiddle.uk, que também é de onde vieram as capturas de tela das tabelas.
Limites desfocados ao brincar com
JOIN
eWHERE
CROSS JOIN
CROSS JOIN
resultando em linhas como A idéia geral /INNER JOIN
:Usar
CROSS JOIN
para obter o resultado de aLEFT OUTER JOIN
requer truques como adicionar em umaNULL
linha. Está omitido.JUNÇÃO INTERNA
INNER JOIN
torna-se um produto cartesiano. É o mesmo que The General Idea /CROSS JOIN
:É aqui que a junção interna pode realmente ser vista como a junção cruzada com resultados que não correspondem à condição removida. Aqui, nenhuma das linhas resultantes é removida.
Usar
INNER JOIN
para obter o resultado de umLEFT OUTER JOIN
também requer truques. Está omitido.JUNTA EXTERNA ESQUERDA
LEFT JOIN
resulta em linhas como A idéia geral /CROSS JOIN
:LEFT JOIN
resulta em linhas como A idéia geral /INNER JOIN
:Os problemas com o diagrama de Venn
Uma pesquisa de imagens na Internet em "sql join cross inner outer" mostrará uma infinidade de diagramas de Venn. Eu costumava ter uma cópia impressa de uma na minha mesa. Mas há problemas com a representação.
O diagrama de Venn é excelente para a teoria dos conjuntos, onde um elemento pode estar em um ou nos dois conjuntos. Mas para bancos de dados, um elemento em um "conjunto" parece, para mim, uma linha em uma tabela e, portanto, também não está presente em nenhuma outra tabela. Não existe uma linha presente em várias tabelas. Uma linha é exclusiva para a tabela.
As junções automáticas são um caso de canto em que cada elemento é de fato o mesmo nos dois conjuntos. Mas ainda não está livre de nenhum dos problemas abaixo.
O conjunto
A
representa o conjunto à esquerda (acitizen
tabela) e o conjuntoB
é o conjunto à direita (apostalcode
tabela) na discussão abaixo.CROSS JOIN
Todos os elementos de ambos os conjuntos são combinados com todos os elementos do outro conjunto, o que significa que precisamos de
A
quantidade de todos osB
elementos eB
quantidade de todos osA
elementos para representar adequadamente esse produto cartesiano. A teoria dos conjuntos não é feita para vários elementos idênticos em um conjunto, então acho que os diagramas de Venn representam adequadamente impraticável / impossível. Parece que nãoUNION
se encaixa.As linhas são distintas. São
UNION
7 linhas no total. Mas eles são incompatíveis para umSQL
conjunto de resultados comum . E não é assim queCROSS JOIN
funciona:Tentando representá-lo assim:
..mas agora parece apenas um
INTERSECTION
, o que certamente não é . Além disso, não há nenhum elemento noINTERSECTION
que está realmente em qualquer um dos dois conjuntos distintos. No entanto, parece muito com os resultados pesquisáveis semelhantes a este:Para referência, um resultado pesquisável para
CROSS JOIN
s pode ser visto em Tutorialgateway . OINTERSECTION
, assim como este, está vazio.JUNÇÃO INTERNA
O valor de um elemento depende da
JOIN
condição. É possível representar isso sob a condição de que cada linha se torne exclusiva para essa condição. O significadoid=x
é verdadeiro apenas para uma linha. Quando uma linha na tabelaA
(citizen
) corresponde a várias linhas na tabelaB
(postalcode
) sob aJOIN
condição, o resultado tem os mesmos problemas queCROSS JOIN
: A linha precisa ser representada várias vezes e a teoria dos conjuntos não é realmente feita para isso. Sob a condição de exclusividade, o diagrama pode funcionar, mas lembre-se de que aJOIN
condição determina a colocação de um elemento no diagrama. Observando apenas os valores daJOIN
condição com o restante da linha logo após o passeio:Essa representação se desfaz completamente ao usar a
INNER JOIN
com umaON 1 = 1
condição que a transforma em aCROSS JOIN
.Com um self-
JOIN
, as linhas são de fato elementos identais em ambas as tabelas, mas representam as tabelas como ambasA
eB
não são muito adequadas. Por exemplo, uma auto-JOIN
condição comum que faz com que um elementoA
corresponda a um elemento diferente em B éON A.parent = B.child
fazer a correspondência deA
paraB
elementos separados. Dos exemplos que seriamSQL
assim:Significado Smith é o líder de Green e Jensen.
JUNÇÃO EXTERNA
Novamente, os problemas começam quando uma linha possui várias correspondências com as linhas na outra tabela. Isso é ainda mais complicado, pois
OUTER JOIN
pode corresponder ao conjunto vazio. Mas, na teoria dos conjuntos, a união de qualquer conjuntoC
e de um conjunto vazio é sempre justaC
. O conjunto vazio não adiciona nada. A representação dissoLEFT OUTER JOIN
é geralmente apenas mostrando tudoA
para ilustrar que as linhasA
são selecionadas independentemente de haver uma correspondência ou nãoB
. Os "elementos correspondentes", no entanto, têm os mesmos problemas que a ilustração acima. Eles dependem da condição. E o conjunto vazio parece ter vagado atéA
:Cláusula WHERE - fazendo sentido
Localizando todas as linhas de a
CROSS JOIN
com Smith e código postal na Lua:Agora, o diagrama de Venn não é usado para refletir o
JOIN
. É usado apenas para aWHERE
cláusula:..e isso faz sentido.
Quando INTERSECT e UNION fazem sentido
INTERSECT
Como explicado, um
INNER JOIN
não é realmente umINTERSECT
. No entanto,INTERSECT
s pode ser usado em resultados de consultas separadas. Aqui, um diagrama de Venn faz sentido, porque os elementos das consultas separadas são de fato linhas que pertencem a apenas um dos resultados ou a ambos. A interseção obviamente retornará apenas resultados onde a linha estiver presente nas duas consultas. IssoSQL
resultará na mesma linha que a acimaWHERE
, e o diagrama de Venn também será o mesmo:UNIÃO
Um
OUTER JOIN
não é umUNION
. No entanto,UNION
trabalhe nas mesmas condições queINTERSECT
, resultando em um retorno de todos os resultados combinando os doisSELECT
s:que é equivalente a:
..e fornece o resultado:
Também aqui um diagrama de Venn faz sentido:
Quando não se aplica
Uma observação importante é que isso só funciona quando a estrutura dos resultados dos dois SELECTs é a mesma, permitindo uma comparação ou união. Os resultados desses dois não permitirão que:
.. tentar combinar os resultados com
UNION
dá umaPara mais informações, leia Diga NÃO aos diagramas de Venn ao explicar JOINs e sql joins como diagrama de venn . Ambos também cobrem
EXCEPT
.fonte
Há muitas boas respostas aqui com exemplos de álgebra relacional muito precisos . Aqui está uma resposta muito simplificada que pode ser útil para codificadores amadores ou iniciantes com dilemas de codificação SQL.
Basicamente, na maioria das vezes, as consultas se
JOIN
resumem a dois casos:Para um
SELECT
subconjunto de dadosA
:INNER JOIN
quando os dados relacionados queB
você procura DEVEM existir por design do banco de dados;LEFT JOIN
quando os dados relacionados queB
você procura MIGHT ou MIGH NOT existem por design do banco de dados.fonte
A diferença entre
inner join
eouter join
é a seguinte:Inner join
é uma junção que combina tabelas com base em tuplas correspondentes, enquanto queouter join
é uma junção que combina tabela com base em tuplas correspondentes e não correspondentes.Inner join
mescla a linha correspondente de duas tabelas na qual a linha não correspondente é omitida, enquantoouter join
mescla linhas de duas tabelas e as linhas não correspondentes são preenchidas com valor nulo.Inner join
é como uma operação de interseção, enquantoouter join
é como uma operação de união.Inner join
são dois tipos, enquantoouter join
são três tipos.outer join
é mais rápido queinner join
.fonte