Qual é a diferença entre Junções Esquerda, Direita, Externa e Interna?

Eu estou querendo saber como diferenciar todas essas junções diferentes …

Exemplo simples : Digamos que você tenha uma tabela de Students e uma tabela de Lockers . No SQL, a primeira tabela que você especifica em uma junit, Students , é a tabela LEFT , e a segunda, Lockers , é a tabela RIGHT .

Cada aluno pode ser atribuído a um armário, portanto, há uma coluna LockerNumber na tabela Student . Mais de um aluno pode estar em um único armário, mas especialmente no início do ano letivo, você pode ter alguns alunos que chegam sem armários e alguns armários que não têm alunos designados.

Por causa deste exemplo, digamos que você tem 100 alunos , dos quais 70 têm armários. Você tem um total de 50 armários , 40 dos quais têm pelo menos 1 aluno e 10 armários não têm aluno.

INNER JOIN é equivalente a ” mostre-me todos os alunos com armários “.
Quaisquer alunos sem armários ou quaisquer armários sem alunos estão faltando.
Retorna 70 linhas

LEFT OUTER JOIN seria ” mostre-me todos os alunos, com o respectivo armário se eles tiverem um “.
Essa pode ser uma lista geral de alunos ou pode ser usada para identificar alunos sem nenhum armário.
Retorna 100 linhas

O DIREITO DE PARTICIPAÇÃO EXTERNA 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 atribuídos ou armários com muitos alunos.
Retorna 80 linhas (lista de 70 alunos nos 40 armários, além dos 10 armários sem aluno)

FULL OUTER JOIN seria tolo e provavelmente não seria de muita utilidade.
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 disso, os 10 armários sem aluno)

CROSS JOIN também é bastante bobo neste cenário.
Ele não usa o campo lockernumber vinculado na tabela de alunos, então, basicamente, você acaba com uma grande lista gigante de todos os possíveis pares de alunos para lockers, quer ele exista ou não.
Retorna 5000 linhas (100 alunos x 50 armários). Poderia ser útil (com filtragem) como um ponto de partida para combinar os novos alunos com os armários vazios.

Aqui está uma visão gráfica de todas as junções que fornecem explicações visuais claras.

explicação visual das junções

e aqui Visual-Representation-of-SQL-Joins explicado em detalhes por CL Moffatt

Existem três tipos básicos de junit:

  • INNER join compara duas tabelas e só retorna resultados onde existe uma correspondência. Registros da primeira tabela são duplicados quando eles correspondem a vários resultados no segundo. Juntas internas tendem a tornar os conjuntos de resultados menores, mas como os registros podem ser duplicados, isso não é garantido.
  • CROSS associação CROSS compara duas tabelas e retorna todas as combinações possíveis de linhas das duas tabelas. Você pode obter muitos resultados desse tipo de junit que podem nem ser significativos, portanto, use com caucanvas.
  • OUTER associação OUTER compara duas tabelas e retorna dados quando uma correspondência está disponível ou valores NULL, caso contrário. Como no INNER join, isso duplicará as linhas da tabela quando corresponder a vários registros na outra tabela. As junções EXTERIORES tendem a tornar os conjuntos de resultados maiores, porque eles não removem por si próprios quaisquer registros do conjunto. Você também deve qualificar uma associação EXTERIOR para determinar quando e onde adicionar os valores NULL:
    • LEFT significa manter todos os registros da primeira tabela, não importando o quê, e inserir valores NULL quando a segunda tabela não corresponder.
    • RIGHT significa o oposto: mantenha todos os registros da segunda tabela, não importando o quê, e insira valores NULL quando a primeira 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ê que a palavra-chave OUTER será omitida da syntax. Em vez disso, será apenas “LEFT JOIN”, “RIGHT JOIN” ou “FULL JOIN”. Isso é feito porque as junções INNER e CROSS não têm nenhum significado em relação a ESQUERDA, DIREITA ou TOTAL, e, portanto, elas são suficientes por si só para indicar inequivocamente uma associação EXTERIOR.

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

  • INNER : Você deseja retornar todos os registros da tabela “Fatura”, juntamente com as “Faturas de faturas” correspondentes. Isso pressupõe que todas as faturas válidas terão pelo menos uma linha.
  • OUTER : você deseja retornar todos os registros “InvoiceLines” de uma fatura específica, junto com os registros “InventoryItem” correspondentes. Esta é uma empresa que também vende serviços, de modo que nem todas as InvoiceLines terão um IventoryItem.
  • CROSS : Você tem uma tabela de dígitos com 10 linhas, cada uma contendo valores de ‘0’ a ‘9’. Você deseja criar uma tabela de período para participar, de modo que acabe com um registro para cada dia dentro do intervalo. Ao unir esta tabela a si mesmo repetidamente, você pode criar quantos números inteiros consecutivos forem necessários (dado que você começa em 10 à 1ª potência, cada junit adiciona 1 ao expoente). Em seguida, use a function DATEADD () para adicionar esses valores à data base do intervalo.

Existem apenas 4 tipos:

  1. Junção interna : o tipo mais comum. Uma linha de saída é produzida para cada par de linhas de input que correspondem às condições de junit.
  2. Junção externa esquerda : O mesmo que uma junit interna, exceto que se houver alguma linha para a qual nenhuma linha correspondente na tabela à direita possa ser localizada, uma linha será impressa contendo os valores da tabela à esquerda, com NULL para cada 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 junit 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 das duas tabelas aparecerá na saída pelo menos uma vez.

Uma “cross join” ou “cartesian join” é simplesmente uma junit interna para a qual nenhuma condição de junit foi especificada, resultando na saída de todos os pares de linhas.

Agradeço ao RusselH por apontar as junções COMPLETAS, que eu omiti.

Confira Join (SQL) na Wikipedia

  • Junção interna – Dadas duas tabelas, uma junit interna retorna todas as linhas que existem em ambas as tabelas
  • left / right (outer) join – Dadas duas tabelas retorna todas as linhas que existem na tabela esquerda ou direita de sua junit, mais as linhas do outro lado serão retornadas quando a cláusula join for uma correspondência ou null será retornado para aquelas colunas

  • Full Outer – Dadas duas tabelas retorna todas as linhas e retornará nulos quando a coluna esquerda ou direita não estiver lá

  • Junção cruzada – junit cartesiana e pode ser perigosa se não for usada com cuidado

SQL JOINS diferença:

Muito simples de lembrar:

INNER JOIN mostra apenas registros comuns a ambas as tabelas.

OUTER JOIN todo o conteúdo de ambas as tabelas são mescladas ou elas são combinadas ou não.

LEFT JOIN é o mesmo que LEFT OUTER JOIN – (Selecione registros da primeira tabela (à esquerda) com os registros correspondentes da tabela à direita.)

RIGHT JOIN é o mesmo que RIGHT OUTER JOIN – (selecione os registros da segunda tabela (à direita) com os registros correspondentes da tabela à esquerda.)

insira a descrição da imagem aqui

LEFT JOIN e RIGHT JOIN são tipos de OUTER JOIN s.

INNER JOIN é o padrão – as linhas das duas tabelas devem corresponder à condição de associação.

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

Junção externa : (esquerda / direita) : Mostra o resultado total da tabela esquerda / direita com a ( s ) linha ( s ) emparelhada ( s ), se existir ou não.

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 eu ganho 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 

No começo você tem que entender o que fazer? Nós conectamos múltiplas tabelas e obtemos resultados específicos das tabelas unidas. A maneira mais simples de fazer isso é cross join .

Vamos dizer que tableA tem duas colunas A e B. E tableB tem três colunas C e D. Se aplicarmos cross join, produziremos muitas linhas sem sentido. Então temos que combinar usando a chave primária para obter dados reais.

À esquerda: ele retornará todos os registros da tabela à esquerda e o registro correspondente da tabela à direita.

Direita: ela retornará oposta à junit Esquerda. Ele retornará todos os registros da tabela à direita e os registros correspondentes da tabela à esquerda.

Inner: Isso é como um cruzamento. Ele retornará apenas os registros correspondentes de ambas as tabelas.

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

Algumas vezes não precisamos de todos os dados e também precisamos apenas de dados ou registros comuns. Podemos facilmente obtê-lo usando esses methods de junit. Lembre-se de que left e right join também são outer join.

Você pode obter todos os registros usando apenas cross join. Mas pode ser caro quando se trata de milhões de registros. Portanto, simplifique usando a junit esquerda, direita, interna ou externa.

obrigado