显式内连接和隐式内连接在效率上有区别吗? 例如:
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;
当前回答
就我个人而言,我更喜欢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行。
这是一个非常简单的例子;这并不能证明查询优化器在更复杂的情况下不会感到困惑并生成不同的计划。
第二种语法具有不必要的交叉连接的可能性:您可以向FROM部分添加表而不对应WHERE子句。这被认为是有害的。
在性能方面,它们是完全相同的(至少在SQL Server中)。
PS:请注意,自SQL Server 2005以来,隐式OUTER JOIN语法已弃用。(仍然支持问题中使用的隐式INNER JOIN语法)
“旧样式”JOIN语法的弃用:只是部分内容
@lomaxx:澄清一下,我非常确定SQL Serv 2005支持上述两种语法。但是不支持下面的语法
select a.*, b.*
from table a, table b
where a.id *= b.id;
具体来说,不支持外部连接(*=)。
基本上,两者之间的区别是一个是用旧的方式写的,而另一个是用现代的方式写的。就我个人而言,我更喜欢使用内、左、外、右定义的现代脚本,因为它们更具解释性,并且使代码更具可读性。
当处理内部连接时,在可读性上也没有真正的区别,然而,当处理左连接和右连接时可能会变得复杂,因为在旧的方法中,你会得到这样的东西:
SELECT *
FROM table a, table b
WHERE a.id = b.id (+);
上面是左连接的旧写法,而不是下面的写法:
SELECT *
FROM table a
LEFT JOIN table b ON a.id = b.id;
正如您可以直观地看到的,编写脚本的现代方式使查询更具可读性。(顺便说一下,右连接也是一样的,外连接稍微复杂一点)。
回到锅炉板,查询的编写方式对SQL编译器来说并没有什么不同,因为它以相同的方式处理查询。我在Oracle数据库中看到了两者的混合,有很多人在其中写东西,有年长的也有年轻的。同样,这可以归结为脚本的可读性以及与您一起开发的团队。