Jon*_*ler 231
INNER JOIN和NATURAL JOIN之间的一个显着区别是返回的列数.
考虑:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
Run Code Online (Sandbox Code Playgroud)
在INNER JOIN
表A和表B在列1将返回
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;
Run Code Online (Sandbox Code Playgroud)
在NATURAL JOIN
表A和表B在列1将返回:
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)
避免重复的列.
(来自标准语法的AFAICT,您不能在自然连接中指定连接列;连接是严格基于名称的.另请参阅维基百科.)
(有一个在内部备忘联接输出;在a.
与b.
部分将不会在列名,你只是有column1
,column2
,column1
,column3
作为标题.)
Boh*_*ian 79
natural left
或natural right
),它假定连接标准是其中两个表匹配的同名列我会避免使用像瘟疫这样的自然连接,因为自然连接是:
Mat*_*lie 23
自然连接只是避免键入的快捷方式,假设连接很简单并且匹配相同名称的字段.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
Run Code Online (Sandbox Code Playgroud)
是相同的...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Run Code Online (Sandbox Code Playgroud)
但是,使用快捷方式格式无法实现的是更复杂的连接...
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)
Run Code Online (Sandbox Code Playgroud)
one*_*hen 13
SQL在很多方面都不忠实于关系模型.SQL查询的结果不是关系,因为它可能具有重复名称,"匿名"(未命名)列,重复行,空值等的列.SQL不会将表视为关系,因为它依赖于列排序等.
NATURAL JOIN
SQL 背后的想法是让它更容易更忠实于关系模型.NATURAL JOIN
两个表的结果将按名称重复列,因此没有匿名列.同样地,UNION CORRESPONDING
并EXCEPT CORRESPONDING
提供解决SQL的在旧的列顺序依赖UNION
语法.
但是,与所有编程技术一样,它要求规则有用.成功的一个要求NATURAL JOIN
是始终命名为列,因为连接隐含在具有相同名称的列上(遗憾的是,在SQL中重命名列的语法是冗长的,但副作用是鼓励在基表中命名列时遵守规则VIEW
s :)
注意SQL NATURAL JOIN
是一个等同连接**,但这不是有用的障碍.考虑到如果NATURAL JOIN
是SQL中唯一支持的连接类型,它仍然是关系完整的.
虽然确实NATURAL JOIN
可以使用INNER JOIN
和projection(SELECT
)编写任何内容,但也INNER JOIN
可以使用product(CROSS JOIN
)和restriction(WHERE
)编写任何内容.进一步注意,NATURAL JOIN
没有共同列名的表之间将给出相同的结果CROSS JOIN
.所以,如果你只对关系结果感兴趣(为什么不关注?!)那么你NATURAL JOIN
是唯一需要的连接类型.当然,从语言设计的角度来看,确实是简单的,例如INNER JOIN
并且CROSS JOIN
有其价值,但也考虑到几乎所有的SQL查询都可以用10种语法不同的方式编写,但在语义上是等价的,这就是使SQL优化器非常难的原因发展.
以下是一些语义等效的示例查询(使用通常的部件和供应商数据库):
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;
Run Code Online (Sandbox Code Playgroud)
**关系自然连接不是等值连接,它是一个投影. - philipxy
小智 8
一个NATURAL
连接是一个只是短期的语法具体 INNER
加盟-或"相等连接" -而且,一旦语法是解开,既代表相同的关系代数操作.与OUTER
(LEFT
/ RIGHT
)或CROSS
连接的情况一样,它不是一种"不同类型"的连接.
请参阅维基百科上的equi-join部分:
自然连接提供了equi-joins的进一步专业化.通过比较两个表中在连接表中具有相同列名的所有列,隐式地产生连接谓词.生成的连接表仅包含每对同名列的一列.
大多数专家都认为NATURAL JOIN很危险,因此强烈反对使用它们.危险来自无意中添加一个新列,名称与另一列相同......
也就是说,所有NATURAL
连接都可以写为INNER
连接(但反之则不然).为此,只需显式创建谓词 - 例如USING
或ON
- 并且,正如Jonathan Leffler指出的那样,选择所需的结果集列以避免"重复"(如果需要).
快乐的编码.
(NATURAL
关键字也可以应用于LEFT
和RIGHT
连接,同样适用.NATURAL LEFT/RIGHT
连接只是特定 LEFT/RIGHT
连接的简短语法.)
归档时间: |
|
查看次数: |
255522 次 |
最近记录: |