所以,我在这个网站上看到了很多SQL示例。我有一个关于内连接(普通JOIN
)和交叉连接(SELECT foo FROM bar,baz WHERE
)的相对性能的问题。结果问题已经被问到:
但我还有一个问题需要澄清。我在答案中没有看到任何内容。
问题是:
假设没有字段为NULL。给出两个等价查询,其中一个是这样的:
SELECT * FROM t1
JOIN t2 ON t1.t2_id=t2.t1_id AND t2.bar='baz'
WHERE t1.foo='bar'
其中一个格式如下:
SELECT * FROM t1,t2
WHERE t1.foo='bar' AND t1.t2_id=t2.t1_id AND t2.bar='baz'
执行时间有差异吗?在对两个表中的值进行限制的情况下,我感兴趣具体,此外还有ID匹配以关联相似的行。请注意,此架构中没有外键约束。
我可能还应该说,我对如何扩展到两个以上的表感兴趣。
预先感谢您的答案,SQL专家!
答案 0 :(得分:3)
您的第一个示例通常称为显式连接,第二个示例是隐式连接。在性能方面,它们应该是等效的,至少在流行的DBMS中是这样。
答案 1 :(得分:2)
我认为大多数“SQL专家”会更像这样编写查询:
SELECT *
FROM t1
INNER JOIN t2
ON t1.t2_id = t2.t1_id
WHERE t1.foo='bar'
AND t2.bar = 'baz';
具体做法是:
INNER
JOIN
语法(尽管可以选择
省略INNER
关键字); JOIN
条款; WHERE
条款。“加入”搜索条件和“过滤器”加入条件之间的区别是主观的,但是从业者之间存在很多共识。
P.S。你所谓的'交叉连接'不是:)正如你所说,这两个查询是等价的(两个'逻辑'内连接,如果你愿意)但是那个不使用显式[INNER] JOIN
语法的查询使用所谓的固定符号。
答案 2 :(得分:1)
对于优化器来说,内部连接标准的重新排序非常容易,并且应该很少有机会弄乱它 - 但如果统计数据已经过时,所有投注都会关闭,它可能会重新进行命令他们首先使用具有错误统计信息的表。但是,即使您选择了订单,当然也可能会影响您。
至少在SQL Server中,优化器通常甚至可以通过视图和内联表值函数向下推送内连接条件,以便它们尽可能高度选择。