2017-02-16 113 views
1

我已阅读W3学校笔记和数据库系统概念书,但自然完整外连接和全外连接之间的区别仍然显得模糊。到目前为止,我的理解是,自然连接将自然地加入匹配列值,在完全外连接中,我们必须明确声明on子句。我们应该吗?或者我在理解中犯了一些错误?“自然全外连接”和“全外连接”之间的区别

+1

我我和Gordon Linoff在一起:简单地忘记自然连接的存在。想象一下,你有一个工作查询,然后有一天某人将某列添加到一个与已连接表中的现有列名称相同的表中(这很容易发生,例如'name','text','image'等列名称) ,“说明”,“状态”等)。然后突然你的查询将返回不正确的结果,尽管查询本身从未改变。 –

+1

使用完全外连接时,通常使用'USING'而不是'ON'顺便说一句(例如'使用(x)'而不是'select coalesce(ax,bx)从完整的外连接b中选择x,ay,bz)作为x,ay,bz来自ax = bx'上的完整外连接b)。这尤其适用于在同一列上有多个外部联接的查询。 –

回答

5

Natural join基本上是一种憎恶。不要使用它。

问题是natural join使用表中列的名称来定义join关系。这使得很难理解查询,因为你不知道这些关系是什么。更糟糕的是,natural join甚至没有使用声明外键关系。代替使用usingon

至于natural full outer joinfull outer join之间的差异。他们都是full outer join。在后者中,您明确定义了join条件的键。在前者中,数据库引擎根据表之间的通用名称选择密钥。

6

那么,对于这些连接正确的条件是:1。 INNER JOIN 2. LEFT OUTER JOIN 3. RIGHT OUTER JOIN 4. FULL OUTER JOIN 5.自然连接

1.内JOIN:(典型的Join操作,它使用一些比较运算符,如=或)。这些包括equi连接和自然连接。 根据每个表的公共列中的值,Inner Joins使用比较运算符来匹配来自两个表的行。

2.外部联接:外部联接可以是左侧,右侧或全部外部联接。 当在FROM子句中指定了外连接时,指定了以下一组关键字:

2.a. LEFT JOIN或LEFT OUTER JOIN:左外连接的结果集包括LEFT OUTER子句中指定的左表中的所有行,而不仅仅是连接列匹配的行。当左表中的行在右表中没有匹配的行时,关联的结果集行包含来自右表的所有选择列列的空值。

2.b.右连接或右连接:右外连接与左外连接相反。返回右表中的所有行。每当右表格行在左表格中没有匹配的行时,就会为左表格返回空值。

2.c. FULL JOIN或FULL OUTER JOIN: Full外部连接返回Left和Right表中的所有行。任何时候一行在另一个表中都不匹配时,另一个表中的选择列表列将包含空值。当表格之间存在匹配时,整个结果集行包含来自基表的数据值。

3。Natural JOIN: NATURAL JOIN是JOIN操作,它基于两个正在连接的表中的公共列为您创建隐式连接子句。通用列是两个表中具有相同名称的列。

NATURAL JOIN可以是INNER连接,LEFT OUTER连接或RIGHT OUTER连接。默认值是INNER连接。

如果在自然连接出现操作的SELECT语句在选择列表中的星号(*),星号将扩大到列名单如下(按顺序):

All the common columns 
Every column in the first (left) table that is not a common column 
Every column in the second (right) table that is not a common column