所以,我在这个网站上看到了很多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'
他们的执行时间有差异吗?我感兴趣的是 specifically ,在对 both 表中的值进行限制的情况下,除了ID匹配以关联像行一样 . 请注意,此架构中没有外键约束 .
我可能也应该说我对如何扩展到两个以上的表感兴趣 .
预先感谢您的答案,SQL专家!
3 回答
您的第一个示例通常称为显式连接,第二个示例是隐式连接 . 在性能方面,它们应该是等效的,至少在流行的DBMS中是这样 .
我认为大多数“SQL专家”会更像这样编写查询:
特别:
强烈偏好
INNER JOIN
语法(尽管可以选择省略INNER
关键字);只在
JOIN
子句中放置'join'谓词;将'filter'谓词放在
WHERE
子句中 .“加入”搜索条件和“过滤器”加入条件之间的区别是主观的,但是从业者之间存在很多共识 .
附:您所谓的'cross join' isn 't :) As you say, the two queries are equivalent (both ' logical ' inner joins, if you will) but the one that doesn' t使用显式的
[INNER] JOIN
语法使用所谓的 infixed notation .重新排序内部连接标准对于优化器来说非常容易,并且应该很少有机会弄乱它 - 但如果统计数据已经过时,所有投注都会关闭,它可能会将它们重新排序为首先使用包含错误统计信息的表 . 但即使您选择订单,当然也可能会影响您 .
至少在SQL Server中,优化器通常甚至可以通过视图和内联表值函数向下推送内连接条件,以便它们尽可能高度选择 .