![]() |
忐忑的领带 · MySQL优化索引 - 废物大师兄 · 2 月前 · |
![]() |
可爱的长颈鹿 · 导致慢SQL的原因和解决方案_云数据库 ...· 2 月前 · |
![]() |
热情的登山鞋 · 快速抽取Oracle数据到Mongo - ...· 1 月前 · |
![]() |
叛逆的青蛙 · Dbeaver中如何使用循环SQL迅速插入万 ...· 1 月前 · |
![]() |
礼貌的跑步机 · Oracle SQL 报错:ORA-06550· 1 月前 · |
![]() |
坏坏的大海 · pixiv官方下载 - 百度· 3 月前 · |
![]() |
风流的韭菜 · PRD:有道云笔记APP产品需求文档 | ...· 3 月前 · |
![]() |
知识渊博的斑马 · 高新概况_乌鲁木齐国家高新区(新市区)· 8 月前 · |
![]() |
气势凌人的太阳 · 奔驰奇瑞共享"EQ/eQ"品牌名称 ...· 1 年前 · |
显式内连接和隐式内连接之间是否存在效率差异?例如:
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;
在性能方面,它们是完全相同的(至少在SQL Server中是这样)。
PS:请注意,从SQL Server2005开始就不再推荐使用
IMPLICIT OUTER JOIN
语法。(仍支持问题中使用的
IMPLICIT INNER JOIN
语法)
Deprecation of "Old Style" JOIN Syntax: Only A Partial Thing
就我个人而言,我更喜欢连接语法,因为它使表的连接以及它们如何连接变得更加清晰。试着比较更大的SQL查询,当你从8个不同的表中选择时,你在where中有很多过滤。通过使用join语法,您可以将表连接的部分与筛选行的部分分开。
在一些数据库(特别是Oracle)上,连接的顺序可能会对查询性能产生巨大的影响(如果有两个以上的表)。在一个应用程序中,我们在某些情况下有两个数量级的差异。如果使用正确的提示语法,使用inner join语法就可以对此进行控制。
您没有指定您正在使用的数据库,但概率建议您使用SQL Server或MySQL,在那里没有真正的区别。
@lomaxx:为了澄清,我非常确定SQL Serv 2005支持上述两种语法。但是,不支持以下语法
select a.*, b.*
from table a, table b
where a.id *= b.id;
具体来说,不支持外部联接(*=)。
您给出的第一个答案使用了众所周知的ANSI join语法,另一个答案是有效的,可以在任何关系数据库中使用。
我同意grom的观点,即应该使用ANSI join语法。正如他们所说,主要原因是为了清晰。没有使用带有许多谓词的where子句,而是让哪些条件用于联接表,哪些条件用于限制结果,而不是让where子句包含许多谓词,其中一些谓词连接表,另一些谓词限制ANSI连接语法返回的行。
正如Leigh Caldwell所说,查询优化器可以根据功能上类似于相同SQL语句的内容生成不同的查询计划。有关这方面的进一步阅读,请查看以下两篇博客帖子:
One posting from the Oracle Optimizer Team
Another posting from the "Structured Data" blog
我希望你会觉得这很有趣。
第二种语法具有不必要的交叉联接的可能性:您可以将表添加到FROM部分,而不需要相应的WHERE子句。这被认为是有害的。
在性能方面,这不会有任何不同。显式的连接语法对我来说似乎更清晰,因为它清楚地定义了from子句中的表之间的关系,并且不会弄乱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 | |
![]() |
忐忑的领带 · MySQL优化索引 - 废物大师兄 2 月前 |
![]() |
礼貌的跑步机 · Oracle SQL 报错:ORA-06550 1 月前 |
![]() |
坏坏的大海 · pixiv官方下载 - 百度 3 月前 |
![]() |
知识渊博的斑马 · 高新概况_乌鲁木齐国家高新区(新市区) 8 月前 |