LEFT JOIN vs. LEFT OUTER JOIN no SQL Server


1595

Qual é a diferença entre LEFT JOINe LEFT OUTER JOIN?


213
Nenhum! A OUTERpalavra-chave é opcional.
jarlh

9
Os diagramas de Venn não são adequados para respostas a esta pergunta. A resposta a esta pergunta é Nenhuma . Veja o primeiro comentário.
Philipxy

3
Os diagramas de Venn ilustram a diferença nas linhas de saída para casos especiais de junção interna x externa . Se nenhum nulo ou linha duplicada forem inseridos (para que possamos considerar uma tabela como um conjunto de valores com valor de linha e usar igualdade matemática normal) , os círculos esquerdo e direito mantêm as tabelas / conjuntos de saída esquerda e direita . Mas se nulos ou linhas duplicadas são inseridas, é tão difícil explicar exatamente do que os círculos são conjuntos e como esses conjuntos se relacionam com tabelas / bolsas de entrada e saída que os diagramas de Venn não são úteis. Veja meus comentários aqui sobre outros abusos do diagrama de Venn.
Philipxy 5/05/19

Respostas:


2237

Conforme a documentação: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

A palavra OUTER- chave está marcada como opcional (entre colchetes). Nesse caso específico, se você especifica OUTERou não, não faz diferença. Observe que, embora os outros elementos da cláusula de junção também sejam marcados como opcionais, deixá- los de fora fará a diferença.

Por exemplo, toda a parte de tipo da JOINcláusula é opcional; nesse caso, o padrão é INNERse você apenas especificar JOIN. Em outras palavras, isso é legal:

SELECT *
FROM A JOIN B ON A.X = B.Y

Aqui está uma lista de sintaxes equivalentes:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Também dê uma olhada na resposta que eu deixei nessa outra pergunta do SO: SQL left join vs multiple tables on FROM FROM? .

insira a descrição da imagem aqui


135
Absolutamente correto. OUTER é permitido para compatibilidade com ANSI-92.
Sean Reilly

11
@ LasseV.Karlsen não seria melhor ter INNER JOINà direita e JOINà esquerda na lista de equivalentes?
Nawfal #

8
@ LasseV.Karlsen Eu apenas quis dizer que o lado esquerdo tem a forma concisa e o lado direito tem a forma expandida. Eu pensei que seria coerente se você seguisse o mesmo por JOINs também.
Nawfal

30
@ Outlier Essa é sua prerrogativa, mas claramente 451 outras pessoas pensaram que a resposta era boa. Para ser sincero, se uma resposta diz X e outra resposta diz X e faz referência à documentação, além de copiar as partes relevantes da documentação na resposta, meu voto vai para a segunda resposta e é por isso que escrevo minhas respostas da maneira Eu faço. Que alguém afirma que X não é bom. Se você pode provar o X, é melhor (para não responder à resposta de sactiw). Mas, é sua prerrogativa pensar o que quiser. Eu pergunto por que você acha inútil, a resposta está errada de alguma forma?
Lasse V. Karlsen

7
@ Outlier E para ser sincero, se você não estiver lendo minhas "longas" respostas, minha resposta não foi para você. É para todo mundo que vem aqui se perguntando sobre a mesma coisa e quer um pano de fundo sobre o porquê disso, e onde encontrar mais informações, etc. Claramente, você é o tipo de pessoa que gostaria dessa resposta: "Nenhuma", mas infelizmente isso não é uma resposta legal aqui no Stack Overflow, nem deveria ser.
Lasse V. Karlsen

700

Para responder à sua pergunta, não há diferença entre LEFT JOIN e LEFT OUTTER JOIN, elas são exatamente as mesmas que disse ...

No nível superior, existem principalmente três tipos de junções:

  1. INTERIOR
  2. EXTERIOR
  3. CRUZ

  1. INNER JOIN - busca dados se presentes nas duas tabelas.

  2. OUTER JOIN são de 3 tipos:

    1. LEFT OUTER JOIN - busca dados se presentes na tabela esquerda.
    2. RIGHT OUTER JOIN - busca dados se presentes na tabela correta.
    3. FULL OUTER JOIN - busca dados, se presentes em uma das duas tabelas.
  3. CROSS JOIN , como o nome sugere, faz [n X m]isso unir tudo a tudo.
    Semelhante ao cenário em que simplesmente listamos as tabelas para associação (na FROMcláusula da SELECTinstrução), usando vírgulas para separá-las.


Pontos a serem observados:

  • Se você acabou de mencionar JOIN, por padrão, é a INNER JOIN.
  • Uma OUTERassociação deve ser LEFT| RIGHT| FULLvocê não pode simplesmente dizer OUTER JOIN.
  • Você pode soltar a OUTERpalavra-chave e apenas dizer LEFT JOINou RIGHT JOINou FULL JOIN.

Para aqueles que desejam visualizá-los de uma maneira melhor, acesse este link: Uma Explicação Visual das Associações SQL


17
Resposta muito boa. Será mais claro se você disser "LEFT OUTTER JOIN - busca todos os dados da tabela esquerda com dados correspondentes da direita, se predefinidos". para 2.1 (e alteração semelhante para 2.2)
ssh

1
Além disso, você pode fazer junção cruzada simplesmente 'selecione * da
Tabela A

3
Desculpe se estou necrobumping, mas é CROSS JOINo mesmo que FULL JOIN?
TechnicalTophat

9
@RhysO não, CROSS JOIN é um produto cartesiano, ou seja, CROSS JOIN de uma tabela, com n linhas, com uma tabela com m linhas, sempre fornecerá (n * m) linhas enquanto JOIN EXTERIOR COMPLETO de uma tabela, com n linhas, com uma tabela, que tem linhas m, dará no máximo (n + m) linhas
sactiw

1
@sactiw considere adicionar uma nota especial em sua valiosa resposta sobre a diferença entre Cross Joine Full Outer Join... de alguma forma, parece semelhante.
Manuel Jordan

356

Qual é a diferença entre junção esquerda e junção externa esquerda?

Nada . LEFT JOINe LEFT OUTER JOINsão equivalentes.


13
olá, olá! quem votou contra isso? LEFT JOIN é o mesmo que LEFT OUTTER JOIN.
6115 Mitch

7
É o caso do Microsoft SQL Server e de qualquer outro RDBMS compatível com SQL.
22477 Bill Karwin

7
Seria bom se você incluísse uma referência ou explicação sobre por que isso OUTERé opcional.
precisa saber é o seguinte

7
Resposta mais concisa e precisa aqui.
Manachi 26/09

4
Obrigado. A resposta aceita tinha muita informação que me deixou mais confusa. Era exatamente isso que eu precisava saber e responde diretamente à pergunta original.
Bacon Brad

66

Eu sou um DBA do PostgreSQL, tanto quanto pude entender a diferença entre a diferença de junções externas ou não externas é um tópico que tem uma discussão considerável em toda a Internet. Até hoje nunca vi diferença entre os dois; Então fui mais longe e tento encontrar a diferença entre eles. No final, li toda a documentação sobre o assunto e encontrei a resposta para isso,

Portanto, se você procurar na documentação (pelo menos no PostgreSQL), pode encontrar esta frase:

"As palavras INNERe OUTERsão opcionais em todas as formas. INNERÉ o padrão; LEFT, RIGHTe FULLimplicam uma associação externa."

Em outras palavras,

LEFT JOINe LEFT OUTER JOINsão os mesmos

RIGHT JOINe RIGHT OUTER JOINsão os mesmos

Espero que possa contribuir para aqueles que ainda estão tentando encontrar a resposta.



43

Acho mais fácil pensar em Junções na seguinte ordem:

  • CROSS JOIN - um produto cartesiano de ambas as tabelas. TODAS as junções começam aqui
  • INNER JOIN - um CROSS JOIN com um filtro adicionado.
  • OUTER JOIN - um INNER JOIN com elementos ausentes (da tabela ESQUERDA ou DIREITA) adicionados posteriormente.

Até eu descobrir esse modelo (relativamente) simples, o JOINS era sempre um pouco mais uma arte negra. Agora eles fazem todo o sentido.

Espero que isso ajude mais do que confunde.


Isso não responde à pergunta.
philipxy

33

Por que esquerda / direita e esquerda / direita são iguais? Vamos explicar por que esse vocabulário. Entenda que junções ESQUERDA e DIREITA são casos específicos da junção EXTERIOR e, portanto, não pode ser outra coisa senão ESQUERDA EXTERNA / DIREITA EXTERNA. A junção OUTER também é chamada de EXTERIOR COMPLETO, em oposição às junções ESQUERDA e DIREITA, que são resultados PARCIAIS da junção OUTER. De fato:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Agora está claro por que essas operações têm aliases, assim como é claro que existem apenas 3 casos: INTERNO, EXTERNO, CRUZ. Com dois sub-casos para o EXTERIOR. O vocabulário, a maneira como os professores explicam isso, bem como algumas respostas acima, geralmente fazem parecer que existem muitos tipos diferentes de associação. Mas é realmente muito simples.


1
"é claro que só existem 3 casos": interessante, mas falho. Considere que uma junção interna é uma junção cruzada especializada (ou seja, mover predicados da junção para a cláusula where). Além disso, considere que a junção externa não é uma junção, é uma união na qual são usados ​​nulos no lugar de colunas 'ausentes'. Portanto, pode-se argumentar que a cruz é a única junção necessária. Observe que o pensamento atual na teoria relacional é que a junção natural satisfaz todos os requisitos de junção. Além disso: você pode explicar se / como o vocabulário " JOINimplica INNER JOIN" se encaixa no seu raciocínio para o vocabulário de junção externa?
onedaywhen

27

Para responder sua pergunta

No Sql Server junta-se à sintaxe OUTER é opcional

É mencionado no artigo msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Portanto, a lista a seguir mostra as sintaxes equivalentes à junção com e sem OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Outras sintaxes equivalentes

INNER JOIN => JOIN
CROSS JOIN => ,

Recomendamos vivamente Dotnet Mob Artice: ingressa no Sql Server insira a descrição da imagem aqui


2
Reutilizando os diagramas de Venn aqui, veja meu comentário sobre a questão.
precisa saber é

20

Existem apenas 3 junções:

  • A) Junção cruzada = Cartesiana (por exemplo: Tabela A, Tabela B)
  • B) Junção interna = JOIN (por exemplo: Tabela A Junção / Tabela de junção interna B)
  • C) Junção externa:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Espero que ajude.


1
Então 5 se junta completamente.
Zeek2

19

Existem principalmente três tipos de JOIN

  1. Interno: busca dados presentes nas duas tabelas
    • Somente JOIN significa INNER JOIN
  2. Exterior: são de três tipos

    • ESQUERDO EXTERIOR - - busca dados presentes apenas na tabela esquerda e na condição de correspondência
    • DIREITO EXTERIOR - - busca dados presentes apenas na tabela correta e na condição de correspondência
    • FULL OUTTER - - busca dados que apresentam uma ou ambas as tabelas
    • (ESQUERDA ou DIREITA ou COMPLETA) A junção externa pode ser escrita sem a escrita "EXTERIOR"
  3. Cross Join: junta tudo a tudo


16

Açúcar sintático, torna mais óbvio para o leitor casual que a junção não é interna.


2
Então ... o que é uma junção externa completa, então?
Amy B

5
tableA FULL OUTER JOIN tableB fornecerá três tipos de registros: todos os registros na tabelaA sem registro correspondente na tabelaB, todos os registros na tabelaB sem registro correspondente na tabelaA e todos os registros na tabelaA com registro correspondente na tabelaB.
Dave DuPlantis 5/10/09

4

Apenas no contexto desta pergunta, quero postar os 2 operadores 'APPLY' também:

JUNTA - SE :

  1. INNER JOIN = JOIN

  2. JUNÇÃO EXTERNA

    • ESQUERDA EXTERIOR JOIN = ESQUERDA JOIN

    • JOIN EXTERIOR DIREITO = JOIN DIREITO

    • JOGO EXTERNO CHEIO = JOGO CHEIO

  3. CROSS JOIN

SELF-JOIN : Este não é exatamente um tipo separado de junção. Basicamente, isso é unir uma tabela a ela mesma usando uma das junções acima. Mas achei que vale a pena mencionar no contexto JOIN discussões, pois você ouvirá esse termo de muitos na comunidade SQL Developer.

APLICAR :

  1. CROSS APPLY - Similar ao INNER JOIN (mas adicionou a vantagem de poder calcular algo na tabela Right para cada linha da tabela Left e retornaria apenas as linhas correspondentes)
  2. APLICAÇÃO EXTERIOR - Semelhante a JUNÇÃO EXTERNA ESQUERDA (mas adicionou vantagem de poder calcular algo na tabela Direita para cada linha da tabela Esquerda e retornaria todas as linhas da tabela Esquerda, independentemente de uma correspondência na tabela Direita)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Exemplo da vida real, quando usar OUTER / CROSS APPLY no SQL

Acho o operador APPLY muito benéfico, pois eles oferecem melhor desempenho do que ter que fazer o mesmo cálculo em uma subconsulta. Eles também substituem muitas funções analíticas em versões mais antigas do SQL Server. É por isso que acredito que, depois de se sentir confortável com o JOINS, um desenvolvedor SQL deve tentar aprender os operadores APPLY a seguir.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.