当前位置:  开发笔记 > 后端 > 正文

显式vs隐式SQL连接

如何解决《显式vs隐式SQL连接》经验,为你挑选了7个好方法。

在显式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语法的弃用:只有部分事物



1> lomaxx..:

性能方面,它们完全相同(至少在SQL Server中).

PS:请注意,IMPLICIT OUTER JOIN自SQL Server 2005以来,语法已被弃用.(IMPLICIT INNER JOIN仍然支持问题中使用的语法)

"旧式"JOIN语法的弃用:只有部分事物


你如何弃用SQL标准?
标准中仍然存在所谓的"内部"或"交叉"变种的"隐含连接".SQL Server不推荐使用从未标准化的"旧式"外连接语法(即`*=`和`=*`).
你能提供支持文件吗?这在多个层面听起来都不对.
@david Crenshaw,隐式联接不再符合标准,并且已经18年没有了.
@lomaxx,为了清楚起见,你可以指定*问题中2的*语法是否已被弃用?
@HLGEM这是不正确的.不推荐使用隐式连接语法(`FROM a,b,c`).它仍然是2003 + SQL标准.
他们使用旧语法而不是内连接来弃用*outer*连接.原因是它们在获得正确方面存在问题,并且在某些情况下可能满足产生不同结果的不同执行计划.

2> grom..:

就个人而言,我更喜欢连接语法,因为它更清楚表格是连接的以及它们如何连接.尝试比较较大的SQL查询,从8个不同的表中进行选择,并在那里进行大量过滤.通过使用连接语法,可以将表连接的部分分离到要过滤行的部分.


我完全同意,但这有点偏离主题.OP询问效率.

3> Matt Fenwick..:

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

这是一个非常简单的案例; 它不会以任何方式证明查询优化器不会混淆并在更复杂的情况下生成不同的计划.



4> edosoft..:

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



5> andy47..:

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

我同意grom你应该使用ANSI连接语法.正如他们所说,主要原因是为了清晰起见.而不是让where子句有很多谓词,其中一些连接表和其他限制使用ANSI连接语法返回的行的其他方法,你正在明确地清楚哪些条件用于连接表,哪些条件用于限制结果.



6> deadbug..:

@lomaxx:为了澄清,我很确定SQL Serv 2005支持上述两种语法.不支持下面的语法

select a.*, b.*  
from table a, table b  
where a.id *= b.id;

具体而言,不支持外连接(*=).



7> 小智..:

在性能方面,它们是完全相同的(至少在SQL Server中是相同的),但是请注意,它们已弃用了这种联接语法,并且sql server2005不支持此类型。

我认为您正在考虑不赞成使用的* =和= *运算符与“外部连接”。

我刚刚测试了给定的两种格式,它们在SQL Server 2008数据库上可以正常工作。以我为例,他们得出了相同的执行计划,但是我不能自信地说这永远是正确的。

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有