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
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.
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.
Agradável. Eu apenas acrescentaria que normalmente, se você escrever apenas 'JOIN', significa INNER JOIN.
matpop
47
Existem apenas 4 tipos:
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.
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.
Junção externa direita : o mesmo que uma junção externa esquerda, exceto com as funções das tabelas invertidas.
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.
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).
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".
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
-InnerjoinofTable1andTable2:-Innerjoin returns both tables merged only when the key(ID_STUDENT)existsin both tables
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
-LeftjoinofTable1andTable2:-Leftjoin merges both tables withall records form table1,in
other words, there might be non-populated fields fromtable2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER
1 Raony -2 Diogo -3 Eduardo l1
4 Luiz l2
-Rightjoinoftable1andtable2:-Rightjoin merges both tables withall records fromtable2,in
other words, there might be non-populated fields fromtable1
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
5- l3
-Outter joinoftable1andtable2:- Returns all records from both tables,in other words, there
might be non-populated fields either fromtable1or2.
ID_STUDENT STUDENT_NAME LOCKER
1 Raony -2 Diogo -3 Eduardo l1
4 Luiz l2
5- l3
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.
Respostas:
Exemplo simples : Digamos que você tenha uma
Students
mesa e umaLockers
mesa. No SQL, a primeira tabela especificada em uma junção ,,Students
é a tabela ESQUERDA , e a segundaLockers
, é a tabela DIREITA .Cada aluno pode ser atribuído a um armário, para que haja uma
LockerNumber
coluna naStudent
tabela. 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
lockernumber
campo 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.
fonte
SELECT * FROM students RIGHT OUTER JOIN lockers...
resultaria em um resultado diferente deSELECT * FROM lockers RIGHT OUTER JOIN students...
. Grande resposta, mas gostaria de vê-lo atualizado com completosSQL
consultasExistem três tipos básicos de associação:
INNER
join 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.CROSS
join 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.OUTER
join 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
OUTER
palavra - 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.fonte
Existem apenas 4 tipos:
NULL
cada valor na tabela à direita. Isso significa que todas as linhas da tabela à esquerda aparecerão pelo menos uma vez na saída.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.
fonte
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 aLEFT OUTER JOIN
- (selecione registros da primeira tabela (mais à esquerda) com os registros correspondentes da tabela à direita).RIGHT JOIN
é igual aRIGHT OUTER JOIN
- (selecione registros da segunda tabela (mais à direita) com os registros correspondentes da tabela esquerda).fonte
Confira Join (SQL) na Wikipedia
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
fonte
Tornar mais visível pode ajudar. Um exemplo:
Tabela 1:
ID_STUDENT STUDENT_NAME
Mesa 2:
ID_STUDENT LOCKER
O que recebo quando faço:
fonte
LEFT JOIN
eRIGHT JOIN
são tipos deOUTER JOIN
s.INNER JOIN
é o padrão - as linhas de ambas as tabelas devem corresponder à condição de junção.fonte
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.
fonte
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
fonte