自然连接和内部连接之间的区别是什么?


当前回答

不同的是,内部(equi/default)连接和自然连接,自然连接公共列中的win将在单次显示,但内部/equi/default/简单连接公共列将显示两次。

其他回答

NATURAL连接只是特定INNER连接(或“等价连接”)的简短语法,一旦语法被解开,两者都表示相同的关系代数操作。它不是一种“不同类型”的连接,就像OUTER(左/右)或CROSS连接一样。

参见维基百科上的equal -join部分:

自然连接提供了等价连接的进一步专门化。通过比较两个表中在连接表中具有相同列名的所有列,隐式地产生连接谓词。对于每对名称相同的列,生成的连接表只包含一列。 大多数专家都认为天然接头是危险的,因此强烈反对使用。危险来自于无意中添加了一个与另一个列同名的新列……

也就是说,所有的NATURAL连接都可以写成INNER连接(反之则不然)。为此,只需显式地创建谓词——例如USING或ON——并且,如Jonathan Leffler所指出的,选择所需的结果集列以避免“重复”。

快乐的编码。


(NATURAL关键字也可以应用于LEFT和RIGHT连接,同样适用。自然左/右连接只是特定左/右连接的简短语法。)

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)

内连接:

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)

内连接和自然连接基本相同,但有细微的区别。不同的是,在自然连接中不需要指定条件,但在内部连接中条件是必须的。如果我们在内连接中指定条件,则生成的表就像笛卡尔积。

INNER JOIN和NATURAL JOIN之间的一个显著区别是返回的列数。

考虑:

TableA                           TableB
+------------+----------+        +--------------------+    
|Column1     | Column2  |        |Column1  |  Column3 |
+-----------------------+        +--------------------+
| 1          |  2       |        | 1       |   3      |
+------------+----------+        +---------+----------+

TableA和TableB在Column1上的INNER JOIN将返回

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      |
+------------+-----------+----------+----------+

TableA和TableB在Column1上的NATURAL JOIN将返回:

SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+    
|Column1     | Column2  | Column3  |
+-----------------------+----------+
| 1          |  2       |   3      |
+------------+----------+----------+

避免了重复列。

(AFAICT从标准语法来看,您不能在自然连接中指定连接列;连接严格基于名称。参见维基百科。)

(在内部连接输出中有一个欺骗;a和b部分不会在列名中;你只需要用columnn1, column2, columnn1, column3作为标题。)

自然连接:它是两个表中所有列的组合或组合结果。 它将返回第一个表相对于第二个表的所有行。

内部连接:这种连接将工作,除非任何列名将在两个表中same