内连接和等连接一样吗?
Posted
技术标签:
【中文标题】内连接和等连接一样吗?【英文标题】:Is inner join the same as equi-join? 【发布时间】:2011-07-25 04:07:09 【问题描述】:你能告诉我内连接和等连接是否相同吗?
【问题讨论】:
【参考方案1】:答案是否定的。
等值连接用于使用显式运算符 = 匹配两个表中的两列:
例子:
select *
from table T1, table2 T2
where T1.column_name1 = T2.column_name2
内连接用于获取两个表之间的叉积,合并两个表中的所有记录。要获得正确的结果,您可以使用等连接或自然连接(表之间的列名必须相同)
使用等值连接(显式和隐式)
select *
from table T1 INNER JOIN table2 T2
on T1.column_name = T2.column_name
select *
from table T1, table2 T2
where T1.column_name = T2.column_name
或者使用自然连接
select *
from table T1 NATURAL JOIN table2 T2
【讨论】:
两个表的行数不同,自然连接有影响吗? @Ahmn21与其他任何连接类型的方式相同【参考方案2】:答案是否定的,这里是为读者简明扼要的。
内连接可以在连接条件中包含等号 (=) 和其他运算符(如 、)。
等值连接在连接条件中只有等号(=)运算符。
Equi join可以是Inner join、Left Outer join、Right Outer join
【讨论】:
equi join 怎么能是左外连接还是右外连接?【参考方案3】:答案是肯定的,但作为结果集。所以这里是一个例子。
考虑三个表:
订单(ord_no、purch_amt、ord_date、customer_id、salesman_id)
customer(customer_id,cust_name, city,grade, salesman_id)
salesman(salesman_id, name, city, Commission)
现在,如果我有这样的查询:
查找订单详情。
使用 INNER JOIN:
SELECT * FROM orders a INNER JOIN customer b ON a.customer_id=b.customer_id
INNER JOIN salesman c ON a.salesman_id=c.salesman_id;
使用 EQUI JOIN:
SELECT * FROM orders a, customer b,salesman c where
a.customer_id=b.customer_id and a.salesman_id=c.salesman_id;
执行这两个查询。您将获得相同的输出。
回答你的问题等值连接和内连接的输出没有区别。但是这两种类型的内部执行可能存在差异。
【讨论】:
这是不正确的。一种使用 ANSI 92 JOIN 语法 (FROM a JOIN b ON a.x = b.y
)。另一个使用非 ANSI 语法 (FROM a, b WHERE a.x = b.y
)。但两者都加入a.x = b.y
,这使它们成为等值连接因为它们使用等号。非等值连接使用等号以外的运算符。这就是它的全部含义。非等值连接示例:FROM a JOIN B ON a.x <> b.y
(不等式连接)、FROM a JOIN b ON a.x BETWEEN b.y AND b.z
(范围连接)。【参考方案4】:
简单地说:等值连接是一种可能的内连接类型
更深入的解释:
内连接是只返回满足特定条件的连接表中的行的连接。这个条件可能是相等的,这意味着我们会有一个equi-join;如果条件不是相等——可能是不相等、大于、小于、介于等——我们有一个nonequi-join,更准确地说是theta-join。
如果我们不希望这些条件必须满足,我们可以有 外连接(返回所有表的所有行),左连接(所有行 从左表返回,只匹配右表),右连接 (返回右表的所有行,只匹配左表)。
【讨论】:
【参考方案5】:一般来说,“内连接”与“等连接”不同。
'equi-join' 表示使用相等运算符或等效运算符连接表。如果外连接只使用相等,我仍然会称它为“等连接”(其他人可能不同意)。
'inner join' 与'outer join' 相对,确定没有匹配值时如何连接两个集合。
【讨论】:
那么,非 EqJoin 是内连接吗? 这是一个很好的解释。是否有正式定义 equi-join 概念的文档或书籍?【参考方案6】:如果必须做出改变,我想就在这里。我用 DB2 对其进行了测试。 在“等连接”中,您必须选择要连接的表的比较列,在内连接中,您不必这样做。示例:-
Select k.id,k.name FROM customer k
inner join dealer on(
k.id =dealer.id
)
这里结果行只有两列行
id name
但我认为在 equi join 中你也必须选择其他表的列
Select k.id,k.name,d.id FROM customer k,dealer d
where
k.id =d.id
这将导致三列的行,你不可能在这里没有不需要的经销商比较列(即使你不想要它),行看起来像
id(from customer) name(from Customer) id(from dealer)
您的问题可能不是这样。但这可能是主要区别之一。
【讨论】:
不需要的比较列是什么意思?如果你不会在 EqJoin 中选择d.id
,那么它也可以工作。以上是关于内连接和等连接一样吗?的主要内容,如果未能解决你的问题,请参考以下文章