是否存在性能差异(在oracle中)
Select * from Table1 T1 Inner Join Table2 T2 On T1.ID = T2.ID
和
Select * from Table1 T1, Table2 T2 Where T1.ID = T2.ID
?
没有!相同的执行计划,看看这两个表:
CREATE TABLE table1 ( id INT, name VARCHAR(20) ); CREATE TABLE table2 ( id INT, name VARCHAR(20) );
使用内部联接的查询的执行计划:
-- with inner join EXPLAIN PLAN FOR SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id; SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY); -- 0 select statement -- 1 hash join (access("T1"."ID"="T2"."ID")) -- 2 table access full table1 -- 3 table access full table2
以及使用WHERE子句的查询的执行计划.
-- with where clause EXPLAIN PLAN FOR SELECT * FROM table1 t1, table2 t2 WHERE t1.id = t2.id; SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY); -- 0 select statement -- 1 hash join (access("T1"."ID"="T2"."ID")) -- 2 table access full table1 -- 3 table access full table2
如果查询优化器正在执行其工作,那么这些查询之间应该没有区别.它们只是两种指定相同结果的方法.
它们应该完全一样.但是,作为编码实践,我宁愿看到加入.它清楚地表达了你的意图,
使用JOIN
使代码更容易阅读,因为它是不言自明的.
速度没有区别(我刚测试过),执行计划是一样的.
我不知道Oracle,但我知道旧语法在SQL Server中已被弃用,并最终会消失.在我在新查询中使用旧语法之前,我会检查Oracle计划用它做什么.
我更喜欢新的语法,而不是将连接标准与其他条件混合.在更新的语法中,更清楚的是创建连接以及正在应用的其他条件.在像这样的简短查询中并不是一个大问题,但是当你有一个更复杂的查询时,它会变得更加混乱.由于人们在基本查询上学习,我倾向于更喜欢人们在复杂查询中需要之前学习使用连接语法.
我再也不知道Oracle,但我知道旧版左连接的SQL Server版本即使在SQL Server 2000中也存在缺陷,并且会产生不一致的结果(有时候左边的连接有时会是交叉连接),所以它永远不应该是用过的.希望Oracle不会遇到同样的问题,但肯定左右连接可能更难以在旧语法中正确表达.
此外,我的经验(当然这完全是个人观点,您可能有不同的经验)使用ANSII标准加入的开发人员倾向于更好地了解联接是什么以及它在获取方面意味着什么数据库中的数据.我相信这是因为大多数具有良好数据库理解力的人倾向于编写更复杂的查询,而在我看来,使用ANSII标准比使用旧样式更容易维护.
[获得奖励...]
使用JOIN语法可以更轻松地注释掉连接,因为它全部包含在一行中.如果要调试复杂查询,这可能很有用
正如其他人所说,它们在功能上是相同的,但是JOIN更清楚地表达了意图.因此,它可能在某些情况下帮助查询优化器在当前的oracle版本中(我不知道它是否确实如此),它可能有助于Oracle未来版本中的查询优化器(没有人有任何想法),或者它可能有帮助,如果你改变数据库供应商.
它们在逻辑上是相同的,但在采用ANSI语法的早期版本的Oracle中,在更复杂的情况下经常出现错误,因此在使用它时有时会遇到Oracle开发人员的阻力.
性能应该是相同的,但我建议使用join-version,因为在外连接方面提高了清晰度.
使用join-version也可以避免无意识的笛卡尔积.
第三个效果是使用更简单的WHERE条件更容易读取SQL.
不要忘记在Oracle中,如果两个表中的连接键属性命名相同,您也可以将其写为:
select * from Table1 inner join Table2 using (ID);
当然,这也有相同的查询计划.