在显式vs隐式内连接中是否存在效率差异?例如:
SELECT * FROM table a INNER JOIN table b ON a.id = b.id;
与
SELECT a.*, b.* FROM table a, table b WHERE a.id = b.id;
lomaxx.. 126
性能方面,它们完全相同(至少在SQL Server中).
PS:请注意,IMPLICIT OUTER JOIN
自SQL Server 2005以来,语法已被弃用.(IMPLICIT INNER JOIN
仍然支持问题中使用的语法)
"旧式"JOIN语法的弃用:只有部分事物
性能方面,它们完全相同(至少在SQL Server中).
PS:请注意,IMPLICIT OUTER JOIN
自SQL Server 2005以来,语法已被弃用.(IMPLICIT INNER JOIN
仍然支持问题中使用的语法)
"旧式"JOIN语法的弃用:只有部分事物
就个人而言,我更喜欢连接语法,因为它更清楚表格是连接的以及它们如何连接.尝试比较较大的SQL查询,从8个不同的表中进行选择,并在那里进行大量过滤.通过使用连接语法,可以将表连接的部分分离到要过滤行的部分.
在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)
table1
有166208行; table2
有大约1000行.
这是一个非常简单的案例; 它不会以任何方式证明查询优化器不会混淆并在更复杂的情况下生成不同的计划.
第二种语法具有交叉连接的不必要的可能性:您可以将表添加到FROM部分而不使用相应的WHERE子句.这被认为是有害的.
您给出的第一个答案使用了所谓的ANSI连接语法,另一个是有效的,可以在任何关系数据库中使用.
我同意grom你应该使用ANSI连接语法.正如他们所说,主要原因是为了清晰起见.而不是让where子句有很多谓词,其中一些连接表和其他限制使用ANSI连接语法返回的行的其他方法,你正在明确地清楚哪些条件用于连接表,哪些条件用于限制结果.
@lomaxx:为了澄清,我很确定SQL Serv 2005支持上述两种语法.不支持下面的语法
select a.*, b.* from table a, table b where a.id *= b.id;
具体而言,不支持外连接(*=).
在性能方面,它们是完全相同的(至少在SQL Server中是相同的),但是请注意,它们已弃用了这种联接语法,并且sql server2005不支持此类型。
我认为您正在考虑不赞成使用的* =和= *运算符与“外部连接”。
我刚刚测试了给定的两种格式,它们在SQL Server 2008数据库上可以正常工作。以我为例,他们得出了相同的执行计划,但是我不能自信地说这永远是正确的。