Qual é a diferença entre as junções esquerda, direita, externa e interna?


562

Gostaria de saber como diferenciar todas essas junções diferentes ...



3
Também depende do seu nível de compreensão, para alguém como você que o artigo não faz nada, mas para alguém que talvez não compreender totalmente junta é bastante claro
SQLMenace

6
Esta é uma duplicata do stackoverflow.com/questions/419375/sql-join-differences e sem dúvida outros ... #
cletus

1
Isso me ajudou muito ... a maneira mais fácil é fazer mesas de teste e brincar com elas. = P
daGrevis

Respostas:


797

Exemplo simples : Digamos que você tenha uma Studentsmesa e uma Lockersmesa. No SQL, a primeira tabela especificada em uma junção ,,Students é a tabela ESQUERDA , e a segunda Lockers, é a tabela DIREITA .

Cada aluno pode ser atribuído a um armário, para que haja uma LockerNumbercoluna na Studenttabela. Mais de um aluno pode estar em um único armário, mas especialmente no início do ano letivo, você pode receber alguns alunos sem armários e alguns que não têm alunos designados.

Para fins de exemplo, digamos que você tenha 100 alunos , 70 dos quais com armários. Você tem um total de 50 armários , 40 dos quais com pelo menos 1 aluno e 10 com armários.

INNER JOIN é equivalente a " mostrar-me todos os alunos com armários ".
Todos os alunos sem armários ou armários sem alunos estão ausentes.
Retorna 70 linhas

ESQUERDO OUTER JOIN seria " mostre-me todos os alunos, com o armário correspondente, se eles tiverem um ".
Pode ser uma lista geral de alunos ou pode ser usada para identificar alunos sem armário.
Retorna 100 linhas

A UNIDADE EXTERNA CERTA seria " mostre-me todos os armários e os alunos designados a eles, se houver algum ".
Isso pode ser usado para identificar armários que não tenham alunos designados ou armários que tenham muitos alunos.
Retorna 80 linhas (lista de 70 alunos nos 40 armários, mais os 10 armários sem aluno)

JOIN EXTERNO COMPLETO seria bobo e provavelmente não muito útil.
Algo como " mostre-me todos os alunos e todos os armários e combine-os onde puder "
Retorna 110 linhas (todos os 100 alunos, incluindo aqueles sem armários. Além dos 10 armários sem alunos)

CROSS JOIN também é bastante tolo nesse cenário.
Ele não usa o lockernumbercampo vinculado na tabela de alunos, então você basicamente acaba com uma grande lista gigante de todos os pares possíveis de aluno para cacifo, independentemente de ele existir ou não.
Retorna 5000 linhas (100 alunos x 50 armários). Pode ser útil (com filtragem) como ponto de partida para combinar os novos alunos com os armários vazios.


12
Usando seu exemplo, a junção CROSS seria útil como ponto de partida para criar atribuições de cacifos: comece com todas as combinações possíveis e use outros critérios para filtrar os resultados da lista.
Joel Coehoorn

1
Boa resposta. Acredito que a junção cruzada é usada com mais frequência para gerar dados de teste a partir de algumas linhas quando você precisa de um grande número de registros.
Eli

6
JUNÇÕES EXTERNAS COMPLETAS podem ser úteis ao procurar dados órfãos ou ao comparar versões diferentes do mesmo conjunto de dados.
Lara Dougan

3
Cross join, também conhecido como produto cartesiano
JavaRocky

3
Eu acho que como você inicia sua consulta afeta o resultado do tipo de associação. Por exemplo, SELECT * FROM students RIGHT OUTER JOIN lockers...resultaria em um resultado diferente de SELECT * FROM lockers RIGHT OUTER JOIN students.... Grande resposta, mas gostaria de vê-lo atualizado com completos SQLconsultas
jbmilgrom

141

Existem três tipos básicos de associação:

  • INNERjoin compara duas tabelas e retorna apenas resultados onde existe uma correspondência. Os registros da 1ª tabela são duplicados quando correspondem a vários resultados na 2ª. As junções INNER tendem a tornar os conjuntos de resultados menores, mas como os registros podem ser duplicados, isso não é garantido.
  • CROSSjoin compara duas tabelas e retorna todas as combinações possíveis de linhas de ambas as tabelas. Você pode obter muitos resultados desse tipo de associação que podem nem ser significativos, portanto, use com cuidado.
  • OUTERjoin compara duas tabelas e retorna dados quando uma correspondência está disponível ou valores NULL caso contrário. Assim como a junção INNER, isso duplicará as linhas em uma tabela quando corresponder a vários registros na outra tabela. As junções OUTER tendem a aumentar os conjuntos de resultados, porque eles próprios não removerão nenhum registro do conjunto. Você também deve qualificar uma associação OUTER para determinar quando e onde adicionar os valores NULL:
    • LEFT significa manter todos os registros da 1ª tabela, independentemente do que for, e inserir valores NULL quando a 2ª tabela não corresponder.
    • RIGHT significa o contrário: mantenha todos os registros da 2ª tabela, não importa o quê, e insira valores NULL quando a 1ª tabela não corresponder.
    • FULL significa manter todos os registros de ambas as tabelas e inserir um valor NULL em qualquer tabela, se não houver correspondência.

Muitas vezes, você vê a OUTERpalavra - chave omitida da sintaxe. Em vez disso, será apenas "LEFT JOIN", "RIGHT JOIN" ou "CHEFE". Isso é feito porque as junções INNER e CROSS não têm significado com relação à ESQUERDA, DIREITA ou CHEIA, e, portanto, são suficientes para indicar inequivocamente uma junção EXTERNA.

Aqui está um exemplo de quando você pode querer usar cada tipo:

  • INNER: Você deseja retornar todos os registros da tabela "Fatura", juntamente com os "InvoiceLines" correspondentes. Isso pressupõe que toda fatura válida terá pelo menos uma linha.
  • OUTER: Você deseja retornar todos os registros "InvoiceLines" para uma fatura específica, juntamente com os registros "InventoryItem" correspondentes. Esse é um negócio que também vende serviço, de forma que nem todos os InvoiceLines tenham um IventoryItem.
  • CROSS: Você tem uma tabela de dígitos com 10 linhas, cada uma contendo os valores de '0' a '9'. Você deseja criar uma tabela de período para ingressar, para acabar com um registro para cada dia no intervalo. Ao ingressar CROSS nesta tabela consigo mesma repetidamente, você pode criar quantos números consecutivos forem necessários (desde que você comece da 10ª à 1ª potência, cada junção adiciona 1 ao expoente). Em seguida, use a função DATEADD () para adicionar esses valores à sua data base para o intervalo.

1
Agradável. Eu apenas acrescentaria que normalmente, se você escrever apenas 'JOIN', significa INNER JOIN.
matpop

47

Existem apenas 4 tipos:

  1. Junção interna : o tipo mais comum. Uma linha de saída é produzida para cada par de linhas de entrada que correspondem às condições de junção.
  2. Junção externa esquerda : o mesmo que uma junção interna, exceto que, se houver alguma linha para a qual nenhuma linha correspondente na tabela à direita possa ser encontrada, será gerada uma linha contendo os valores da tabela à esquerda, com NULLcada valor na tabela à direita. Isso significa que todas as linhas da tabela à esquerda aparecerão pelo menos uma vez na saída.
  3. Junção externa direita : o mesmo que uma junção externa esquerda, exceto com as funções das tabelas invertidas.
  4. Junção externa completa : uma combinação de junções externas esquerda e direita. Cada linha de ambas as tabelas aparecerá na saída pelo menos uma vez.

Uma "junção cruzada" ou "junção cartesiana" é simplesmente uma junção interna para a qual nenhuma condição de junção foi especificada, resultando na saída de todos os pares de linhas.

Agradeço a RusselH por apontar junções COMPLETAS, que eu havia omitido.


1
e a junção externa completa e a junção cruzada (produto cartesiano)?
SQLMenace 15/01/09

completo é realmente o equivalente a duas associações externas
RussellH

25
CHEIO é o que você obtém quando estraga sua junção interna e, em seguida, faz uma pergunta aqui "por que estou recebendo N ^ 2 linhas em vez de N"? Então todo mundo fica CRUZ com você.
Paul Tomblin

24

Diferença SQL JOINS:

Muito simples de lembrar:

INNER JOIN mostra apenas registros comuns a ambas as tabelas.

OUTER JOIN todo o conteúdo de ambas as tabelas é mesclado, correspondendo ou não.

LEFT JOINé igual a LEFT OUTER JOIN- (selecione registros da primeira tabela (mais à esquerda) com os registros correspondentes da tabela à direita).

RIGHT JOINé igual a RIGHT OUTER JOIN- (selecione registros da segunda tabela (mais à direita) com os registros correspondentes da tabela esquerda).

insira a descrição da imagem aqui


Existe uma maneira correta e relevante de rotular os círculos do diagrama de Venn, mas não é isso. Os círculos não são as tabelas de entrada. Além disso, as linhas de resultado não são linhas de entrada; portanto, sua descrição está incorreta. Além disso, isso não está claro - você não explica "comum a ambos", "correspondido", "mesclado".
philipxy

9

Confira Join (SQL) na Wikipedia

  • Junção interna - Dadas duas tabelas, uma junção interna retorna todas as linhas existentes nas duas tabelas
  • junção esquerda / direita (externa) - Dadas duas tabelas retornam todas as linhas existentes na tabela esquerda ou direita da sua junção, mais as linhas do outro lado serão retornadas quando a cláusula de junção for uma correspondência ou nulo será retornado para essas colunas

  • Exterior completo - Dadas duas tabelas retorna todas as linhas e retornará nulos quando a coluna esquerda ou direita não estiver lá

  • Junções cruzadas - junção cartesiana e pode ser perigoso se não for usado com cuidado


6

Tornar mais visível pode ajudar. Um exemplo:

Tabela 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Mesa 2:

ID_STUDENT LOCKER

3               l1
4               l2
5               l3

O que recebo quando faço:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOINe RIGHT JOINsão tipos de OUTER JOINs.

INNER JOIN é o padrão - as linhas de ambas as tabelas devem corresponder à condição de junção.


5
Não acredito como essa resposta tem muitos votos positivos e, ao mesmo tempo, é tão incompleta.
nbro

Eu acho que foi uma resposta melhor para a pergunta original.
RussellH

3

Junção interna : mostra apenas linhas, quando possui dados de ambas as tabelas.

Junção externa : (esquerda / direita) : Mostrar a todos resultam da / direita esquerda mesa com a linha emparelhado ( s ), se ele existe ou não.


2

No começo você precisa entender o que a junção faz? Conectamos várias tabelas e obtemos resultados específicos das tabelas unidas. A maneira mais simples de fazer isso é a junção cruzada .

Digamos que a tabela A tenha duas colunas A e B. E a tabela B tenha três colunas C e D. Se aplicarmos a junção cruzada, ela produzirá muitas linhas sem sentido. Então temos que combinar usando a chave primária para obter dados reais.

Esquerda: retornará todos os registros da tabela esquerda e os registros correspondentes da tabela direita.

Direita: retornará oposto à junção esquerda. Ele retornará todos os registros da tabela direita e os registros correspondentes da tabela esquerda.

Interior: É como um cruzamento. Ele retornará apenas registros correspondentes de ambas as tabelas.

Exterior: E isso é como união. Ele retornará todos os registros disponíveis das duas tabelas.

Às vezes, não precisamos de todos os dados e também precisamos apenas de dados ou registros comuns. podemos obtê-lo facilmente usando esses métodos de junção. Lembre-se de que a junção esquerda e direita também são junções externas.

Você pode obter todos os registros usando a junção cruzada. Mas pode ser caro quando se trata de milhões de registros. Portanto, simplifique usando a junção esquerda, direita, interna ou externa.

obrigado

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.