Qual é a diferença entre uma junção natural e uma junção interna?
Qual é a diferença entre uma junção natural e uma junção interna?
Respostas:
Uma diferença significativa entre INNER JOIN e NATURAL JOIN é o número de colunas retornadas.
Considerar:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
As INNER JOIN
tabelas TableA e TableB na coluna1 retornarão
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
O NATURAL JOIN
TableA e TableB na coluna1 retornará:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
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ó tem column1
, column2
, column1
, column3
como os títulos. )
NATURAL JOIN
vai arruinar, por que é inesperado e em que mundo você está?
Customers
e Employees
participando EmployeeID
. Employees
também tem um ManagerID
campo Está tudo bem. Então, algum dia, alguém adiciona um ManagerID
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)
e SELECT * FROM TableA NATURAL JOIN TableB
são iguais, ambos fornecem 3 colunas.
natural left
ou natural 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:
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ão tablename_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.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
É o mesmo que...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
O que você não pode fazer com o formato de atalho, no entanto, é junções mais complexas ...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
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 denominadas room_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 de NATURAL JOIN
duas tabelas terá colunas desduplicadas por nome, portanto, nenhuma coluna anônima. Da mesma forma, UNION CORRESPONDING
e EXCEPT CORRESPONDING
são fornecidos para abordar a dependência do SQL na ordenação de colunas na UNION
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 e VIEW
s :)
Observe que um SQL NATURAL JOIN
é uma junção equi **, no entanto, isso não impede a utilidade. Considere que, se NATURAL 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 usando INNER JOIN
e projection ( SELECT
), também é verdade que qualquer um INNER JOIN
pode ser escrito usando product ( CROSS JOIN
) e restrição ( WHERE
); Observe também que uma NATURAL JOIN
tabela entre sem nomes de colunas em comum dará o mesmo resultado que CROSS JOIN
. Portanto, se você está interessado apenas em resultados que são relações (e por que nunca ?!), esse NATURAL JOIN
é o único tipo de associação que você precisa. Claro, é verdade que, de uma perspectiva de design de linguagem, abreviações como INNER JOIN
e CROSS 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:
SELECT *
FROM S NATURAL JOIN SP;
-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
FROM S INNER JOIN SP
USING (SNO);
-- Alternative projection
SELECT S.*, PNO, QTY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- 'Old school'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** A junção natural relacional não é um equijoin, é uma projeção de um. - philipxy
Uma NATURAL
junção é apenas uma sintaxe curta para uma junção específica INNER
- 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 de OUTER
( LEFT
/ RIGHT
) ou CROSS
junções.
Veja a seção equi-join na Wikipedia:
Uma junção natural oferece uma especialização adicional de junções equi. O predicado de junção surge implicitamente comparando todas as colunas nas duas tabelas que possuem os mesmos nomes de coluna nas tabelas unidas. A tabela unida resultante contém apenas uma coluna para cada par de colunas com o mesmo nome.
A maioria dos especialistas concorda que JUNTAS NATURAIS são perigosas e, portanto, desencorajam fortemente seu uso. O perigo advém da adição inadvertida de uma nova coluna, com o mesmo nome de outra coluna ...
Ou seja, todas as NATURAL
junções podem ser escritas como INNER
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 aplicada LEFT
e RIGHT
associa - se, e o mesmo se aplica. Uma NATURAL LEFT/RIGHT
associação é apenas uma sintaxe curta para uma associação específica LEFT/RIGHT
.)
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
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 =
, <=
, >=
, <
, >
,<>
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.
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.
mysql> SELECT * FROM tb1 ;
+----+------+
| id | num |
+----+------+
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb2 ;
+----+------+
| id | num |
+----+------+
| 4 | 40 |
| 5 | 50 |
| 9 | 90 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
JUNÇÃO INTERNA :
mysql> SELECT * FROM tb1 JOIN tb2 ;
+----+------+----+------+
| id | num | id | num |
+----+------+----+------+
| 6 | 60 | 4 | 40 |
| 7 | 70 | 4 | 40 |
| 8 | 80 | 4 | 40 |
| 1 | 1 | 4 | 40 |
| 2 | 2 | 4 | 40 |
| 3 | 3 | 4 | 40 |
| 6 | 60 | 5 | 50 |
| 7 | 70 | 5 | 50 |
| 8 | 80 | 5 | 50 |
.......more......
return 36 rows in set (0.01 sec)
AND NATURAL JOIN :
mysql> SELECT * FROM tb1 NATURAL JOIN tb2 ;
+----+------+
| id | num |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
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.