显式内连接和隐式内连接在效率上有区别吗? 例如:
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;
显式内连接和隐式内连接在效率上有区别吗? 例如:
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中)。
PS:请注意,自SQL Server 2005以来,隐式OUTER JOIN语法已弃用。(仍然支持问题中使用的隐式INNER JOIN语法)
“旧样式”JOIN语法的弃用:只是部分内容
其他回答
在一些数据库(尤其是Oracle)中,连接的顺序会对查询性能产生巨大的影响(如果有两个以上的表)。在一个应用程序中,我们在某些情况下有两个数量级的差异。如果使用正确的提示语法,使用内部连接语法可以控制这一点。
您没有指定使用哪个数据库,但可能建议使用SQL Server或MySQL,在那里它没有真正的区别。
在性能方面,它们是完全相同的(至少在SQL Server中),但要注意,它们不支持这种连接语法,而且SQL server2005不支持开箱即用的连接语法。
我认为您想到的是已弃用的*=和=*操作符vs。“外连接”。
我刚刚测试了给出的两种格式,它们在SQL Server 2008数据库上正常工作。在我的案例中,他们得到了相同的执行计划,但我不能肯定地说这总是正确的。
就我个人而言,我更喜欢join语法,因为它更清楚地表明表是连接的以及它们是如何连接的。尝试比较更大的SQL查询,其中您从8个不同的表中选择,并且在where中有很多过滤。通过使用联接语法,可以分离出连接表的部分和过滤行的部分。
在性能方面,它们是完全相同的(至少在SQL Server中)。
PS:请注意,自SQL Server 2005以来,隐式OUTER JOIN语法已弃用。(仍然支持问题中使用的隐式INNER JOIN语法)
“旧样式”JOIN语法的弃用:只是部分内容
在MySQL 5.1.51中,两个查询有相同的执行计划:
mysql> explain select * from table1 a inner join table2 b on a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| 1 | SIMPLE | b | ALL | PRIMARY | NULL | NULL | NULL | 986 | |
| 1 | SIMPLE | a | ref | pid | pid | 4 | schema.b.pid | 70 | |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.02 sec)
mysql> explain select * from table1 a, table2 b where a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| 1 | SIMPLE | b | ALL | PRIMARY | NULL | NULL | NULL | 986 | |
| 1 | SIMPLE | a | ref | pid | pid | 4 | schema.b.pid | 70 | |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.00 sec)
表1有166208行;表2大约有1000行。
这是一个非常简单的例子;这并不能证明查询优化器在更复杂的情况下不会感到困惑并生成不同的计划。