Qual é a diferença entre uma junção natural e uma junção interna?
sql
join
natural-join
ferreiro
fonte
fonte
Respostas:
Uma diferença significativa entre INNER JOIN e NATURAL JOIN é o número de colunas retornadas.
Considerar:
As
INNER JOIN
tabelas TableA e TableB na coluna1 retornarãoO
NATURAL JOIN
TableA e TableB na coluna1 retornará:A coluna repetida é evitada.
(AFAICT da gramática padrão, você não pode especificar as colunas de junção em uma junção natural; a junção é estritamente baseada em nome. Consulte também Wikipedia .)
( Há uma trapaça na saída da junção interna; o
a.
eb.
partes não estariam em nomes de coluna; você só temcolumn1
,column2
,column1
,column3
como os títulos. )fonte
NATURAL JOIN
vai arruinar, por que é inesperado e em que mundo você está?Customers
eEmployees
participandoEmployeeID
.Employees
também tem umManagerID
campo Está tudo bem. Então, algum dia, alguém adiciona umManagerID
campo àCustomers
mesa. Sua associação não será interrompida (isso seria uma piedade), mas agora incluirá um segundo campo e funcionará incorretamente . Assim, uma mudança aparentemente inofensiva pode quebrar algo apenas distante. MUITO MAL. A única vantagem de uma junção natural é economizar um pouco de digitação, e a desvantagem é substancial.SELECT * FROM TableA INNER JOIN TableB USING (Column1)
fornece 4 colunas. Isso não está correto porque,SELECT * FROM TableA INNER JOIN TableB USING (Column1)
eSELECT * FROM TableA NATURAL JOIN TableB
são iguais, ambos fornecem 3 colunas.natural left
ounatural right
) que pressupõe que os critérios de junção estejam onde as colunas com o mesmo nome nas duas tabelas coincidemEu evitaria o uso de junções naturais como a praga, porque as junções naturais são:
não ésql padrão [SQL 92] e,portanto, não éportátil, não é particularmente legível (pela maioria dos codificadores SQL) e possivelmente não é suportado por várias ferramentas / bibliotecasfonte
NATURAL JOIN Checkouts
' só é possível quando banco de dados convenções de nomenclatura são formais e executadas ...."id
é onipresente e inútil participar; nomes de chaves estrangeiras comuns sãotablename_id
. Associações naturais são uma má, má, má ideia.Uma junção natural é apenas um atalho para evitar a digitação, com a presunção de que a junção é simples e corresponde a campos com o mesmo nome.
É o mesmo que...
O que você não pode fazer com o formato de atalho, no entanto, é junções mais complexas ...
fonte
NATURAL JOIN ... USING ()
:? O padrão éa NATURAL JOIN b
ora JOIN b USING (c)
room_number
, enquanto suas junções internas terão duas colunas denominadasroom_number
.O SQL não é fiel ao modelo relacional de várias maneiras. O resultado de uma consulta SQL não é uma relação, pois pode ter colunas com nomes duplicados, colunas 'anônimas' (sem nome), linhas duplicadas, nulos etc. O SQL não trata tabelas como relações, porque depende da ordem das colunas, etc.
A idéia por trás
NATURAL JOIN
do SQL é facilitar a fidelidade ao modelo relacional. O resultado deNATURAL JOIN
duas tabelas terá colunas desduplicadas por nome, portanto, nenhuma coluna anônima. Da mesma forma,UNION CORRESPONDING
eEXCEPT CORRESPONDING
são fornecidos para abordar a dependência do SQL na ordenação de colunas naUNION
sintaxe herdada .No entanto, como em todas as técnicas de programação, requer disciplina para ser útil. Um requisito para um êxito
NATURAL JOIN
é consistentemente nomeado de colunas, porque as junções são implícitas em colunas com os mesmos nomes (é uma pena que a sintaxe para renomear colunas no SQL seja detalhada, mas o efeito colateral é incentivar a disciplina ao nomear colunas nas tabelas base eVIEW
s :)Observe que um SQL
NATURAL JOIN
é uma junção equi **, no entanto, isso não impede a utilidade. Considere que, seNATURAL JOIN
fosse o único tipo de junção suportado no SQL, ele ainda estaria completo em termos relacionais .Embora seja verdade que qualquer um
NATURAL JOIN
possa ser escrito usandoINNER JOIN
e projection (SELECT
), também é verdade que qualquer umINNER JOIN
pode ser escrito usando product (CROSS JOIN
) e restrição (WHERE
); Observe também que umaNATURAL JOIN
tabela entre sem nomes de colunas em comum dará o mesmo resultado queCROSS JOIN
. Portanto, se você está interessado apenas em resultados que são relações (e por que nunca ?!), esseNATURAL JOIN
é o único tipo de associação que você precisa. Claro, é verdade que, de uma perspectiva de design de linguagem, abreviações comoINNER JOIN
eCROSS JOIN
têm seu valor, mas também consideramos que quase qualquer consulta SQL pode ser escrita de 10 maneiras sintaticamente diferentes, mas semanticamente equivalentes, e é isso que torna os otimizadores de SQL tão difíceis desenvolver.Aqui estão alguns exemplos de consultas (usando o banco de dados usual de peças e fornecedores ) que são semanticamente equivalentes:
** A junção natural relacional não é um equijoin, é uma projeção de um. - philipxy
fonte
Uma
NATURAL
junção é apenas uma sintaxe curta para uma junção específicaINNER
- ou "junção equi" - e, uma vez que a sintaxe é desembrulhada, ambos representam a mesma operação de Álgebra Relacional. Não é um "tipo diferente" de junção, como no caso deOUTER
(LEFT
/RIGHT
) ouCROSS
junções.Veja a seção equi-join na Wikipedia:
Ou seja, todas as
NATURAL
junções podem ser escritas comoINNER
junções (mas o inverso não é verdadeiro). Para fazer isso, basta criar o predicado explicitamente - por exemplo,USING
ouON
- e, como Jonathan Leffler apontou, selecione as colunas desejadas do conjunto de resultados para evitar "duplicatas", se desejado.Feliz codificação.
(A
NATURAL
palavra-chave também pode ser aplicadaLEFT
eRIGHT
associa - se, e o mesmo se aplica. UmaNATURAL LEFT/RIGHT
associação é apenas uma sintaxe curta para uma associação específicaLEFT/RIGHT
.)fonte
Junção natural: é um resultado combinado ou combinado de todas as colunas nas duas tabelas. Ele retornará todas as linhas da primeira tabela em relação à segunda tabela.
Junção interna: essa junção funcionará, a menos que algum nome da coluna seja sxame em duas tabelas
fonte
Uma Junção Natural é onde duas tabelas são unidas com base em todas as colunas comuns.
coluna comum: é uma coluna com o mesmo nome nas duas tabelas + com tipos de dados compatíveis nas duas tabelas. Você pode usar apenas = operador
Uma Junção Interna é onde duas tabelas são unidas com base em colunas comuns mencionadas na cláusula ON.
coluna comum: é uma coluna que possui tipos de dados compatíveis nas duas tabelas, mas não precisa ter o mesmo nome. Você só pode usar qualquer operador de comparação, como
=
,<=
,>=
,<
,>
,<>
fonte
A diferença é que int a junção interna (equi / padrão) e a junção natural que na coluna comum da junção natuarl serão exibidas em um único tempo, mas a junção interna / equi / padrão / simples a coluna comum será exibida duas vezes.
fonte
A junção interna e a junção natural são quase iguais, mas há uma pequena diferença entre elas. A diferença está na junção natural, não é necessário especificar a condição, mas na condição de junção interna é obrigatória. Se especificarmos a condição na junção interna, as tabelas resultantes serão como um produto cartesiano.
fonte
JUNÇÃO INTERNA :
fonte
Junção interna, junte duas tabelas em que o nome da coluna é o mesmo.
Junção natural, junte duas tabelas em que o nome da coluna e os tipos de dados são iguais.
fonte
NATURAL JOIN
(como várias pessoas apontaram anos atrás) é aquela em que os nomes das colunas são os mesmos. O tipo de dados não precisa ser o mesmo. Os campos usados para umaINNER JOIN
necessidade não precisam ter o mesmo nome.