显式内连接和隐式内连接在效率上有区别吗? 例如:

SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;

vs.

SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;

当前回答

在性能方面,它们是完全相同的(至少在SQL Server中),但要注意,它们不支持这种连接语法,而且SQL server2005不支持开箱即用的连接语法。

我认为您想到的是已弃用的*=和=*操作符vs。“外连接”。

我刚刚测试了给出的两种格式,它们在SQL Server 2008数据库上正常工作。在我的案例中,他们得到了相同的执行计划,但我不能肯定地说这总是正确的。

其他回答

在性能方面,它们是完全相同的(至少在SQL Server中)。

PS:请注意,自SQL Server 2005以来,隐式OUTER JOIN语法已弃用。(仍然支持问题中使用的隐式INNER JOIN语法)

“旧样式”JOIN语法的弃用:只是部分内容

正如Leigh Caldwell所述,查询优化器可以根据功能上类似于相同SQL语句的内容生成不同的查询计划。欲进一步阅读,请参阅以下两篇博客文章:-

一篇来自Oracle优化团队的帖子

另一篇来自“结构化数据”博客的文章

我希望你会觉得这很有趣。

就我个人而言,我更喜欢join语法,因为它更清楚地表明表是连接的以及它们是如何连接的。尝试比较更大的SQL查询,其中您从8个不同的表中选择,并且在where中有很多过滤。通过使用联接语法,可以分离出连接表的部分和过滤行的部分。

你给出的第一个答案使用了所谓的ANSI连接语法,另一个是有效的,可以在任何关系数据库中工作。

我同意grom的观点,你应该使用ANSI连接语法。正如他们所说,主要原因是为了清晰。与其使用带有大量谓词的where子句(其中一些用于连接表,另一些用于限制ANSI连接语法返回的行),不如盲目地明确哪些条件用于连接表,哪些条件用于限制结果。

在性能方面,它们是完全相同的(至少在SQL Server中),但要注意,它们不支持这种连接语法,而且SQL server2005不支持开箱即用的连接语法。

我认为您想到的是已弃用的*=和=*操作符vs。“外连接”。

我刚刚测试了给出的两种格式,它们在SQL Server 2008数据库上正常工作。在我的案例中,他们得到了相同的执行计划,但我不能肯定地说这总是正确的。