oracle中的内部联接和equi联接之间有什么区别?以下哪项查询提供了高性能?

oracle中的内部联接和equi联接之间有什么区别?以下哪项查询提供了高性能?,oracle,Oracle,oracle中的内部联接和equi联接之间有什么区别?以下哪项查询提供了高性能 select e.*,d.* from emp e,dept d where d.DNAME='ACCOUNTING' and e.DEPTNO=d.DEPTNO --(equi join) select e.*,d.* from emp e inner join dept d on e.deptno=d.deptno where d.dname='ACCOUNTING'; --(inner join) Eq

oracle中的内部联接和equi联接之间有什么区别?以下哪项查询提供了高性能

select e.*,d.* 
from emp e,dept d
where d.DNAME='ACCOUNTING' and e.DEPTNO=d.DEPTNO --(equi join)

select e.*,d.*
from emp e
inner join dept d on e.deptno=d.deptno 
where d.dname='ACCOUNTING'; --(inner join)

Equijoin是检查一个值是否等于另一个值的连接。 内部联接是等分联接,使用带有“=”符号的where子句的联接是等分联接。所以您的问题是:使用where子句或内部join语句是否更快?这个问题在这里得到了回答:

宠坏:他们使用相同的计划,所以他们没有区别。 哦,在第二种情况下,你可以这样做:

select e.*,d.*
from emp e
inner join dept d on e.deptno=d.deptno and d.dname='ACCOUNTING';
希望对您有所帮助。

“Equi join”是一种将相等性用于比较运算符的联接。一些人将术语equi join限制为仅内部联接(例如),其他人将该术语用于内部联接和外部联接(例如)

您的示例查询都是equi联接,都是内部联接。不同的是语法,第一个直到SQL-92标准才可用。在这两种情况下,优化器应该提出相同的计划。显式内部联接有助于避免意外的交叉联接

非等内部联接:

 select x
 from X
 inner join Y
     on Y.BeginDate <= X.SomeDate
     and X.SomeDate < Y.EndDate
选择x
从X
内连接Y

在Y.BeginDate上,两个示例都是内部联接。(内部的“对立面”是外部的;两个查询都是内部联接,没有一个是外部联接。)“Equi”联接表示联接,其中联接条件是联接表中列的值相等。你的两个例子都是等连接

您的示例之间的区别仅在于语法——第一个示例使用旧的专有Oracle语法(不推荐),第二个示例使用标准的现代ANSI(SQL标准)语法(推荐)


另外:您的两个查询是等价的。优化器将它们转换为相同的可执行操作-因此没有性能差异。

Equi join是内部join的子集吗?我认为连接条件为相等的外部连接(例如
a.id(+)=b.id
,使用Oracle语法)仍然是相等连接,不是吗?搜索,相等连接不是标准化的。有些限制仅限于内部联接。将更新。我个人认为将筛选条件(例如d.dname='ACCOUNTING')放入联接部分是不好的风格。这可能不会影响结果(如果您出于某种原因更改为和外部联接,则会影响结果),但这会使查询更难阅读,尤其是在不同表上有筛选器的情况下,因为筛选器条件会分布在所有不同的on子句中。我同意,我认为更好地理解这两个版本实际上是相同的,但我也使用where语句,即使是在内部连接上。我只将比较两个表的条件放在on子句之后。@fhossfel-正如您自己所指出的,在外部联接中,单个表上的筛选器可能会产生不同的结果,这取决于它是包含在联接条件中还是包含在WHERE子句中。所以我不太明白你的意思。在编写内部联接时,为什么在联接条件中放置单表筛选器是不好的风格?我自己不是这样做的,但我认为这是一个偏好问题,不是好的还是坏的风格。嗨,你能告诉我为什么推荐现代风格吗?使用旧版本有什么问题/缺点吗?非常感谢您的回答