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

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;

当前回答

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

其他回答

在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行。

这是一个非常简单的例子;这并不能证明查询优化器在更复杂的情况下不会感到困惑并生成不同的计划。

在一些数据库(尤其是Oracle)中,连接的顺序会对查询性能产生巨大的影响(如果有两个以上的表)。在一个应用程序中,我们在某些情况下有两个数量级的差异。如果使用正确的提示语法,使用内部连接语法可以控制这一点。

您没有指定使用哪个数据库,但可能建议使用SQL Server或MySQL,在那里它没有真正的区别。

第二种语法具有不必要的交叉连接的可能性:您可以向FROM部分添加表而不对应WHERE子句。这被认为是有害的。

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

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

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